今天要講的是Liskov Substitution Principle,LSP (里氏替換原則),
會跟前面介紹到的多型、繼承,以及開放封閉原則的概念有關。
還不熟悉的,可以參考一下前面的文章:
1.91之ASP.NET由淺入深 不負責講座 Day14 - Object Oriented (1)
2.91之ASP.NET由淺入深 不負責講座 Day18 - 開放封閉原則
1.定義
(1)If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,
the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
(2)Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
2.簡單的說
使用父類的地方,必須可以使用子類別代替,而不需要任何改變。
3.目的
用來規範繼承的標準。
4.原則
(1)子類別必須完全實現父類別的方法
(2)子類別可以擁有自己不同的屬性與方法
(3)要小心參數型別與return型別,型別涵蓋範圍大小造成的問題:override與overload的差異
5.針對違反LSP設計時可行的重構(Refactoring)方式
當Class A錯誤的繼承Class B時:
(1)可建構一個新的abstract class C,作為2個concrete Class A與B的父類別,也就是多抽象一層來當兩個的父類別,讓A與B在繼承鏈中深度一樣,來避免A繼承B的強耦合與錯誤使用
(2)也可以透過委派的方式來解決(分離)A與B的錯誤繼承關係。
6.參考
(1)http://www.engr.mun.ca/~theo/Courses/ssd/pub/sd-principles-3.pdf
(2)http://irw.ncut.edu.tw/peterju/se.html
PS:晚一點再補上比較好懂的sample code