[ASP.NET]91之ASP.NET由淺入深 不負責講座 Day21 - LSP 里氏替換原則
前言
今天要講的是Liskov Substitution Principle,LSP (里氏替換原則),
會跟前面介紹到的多型、繼承,以及開放封閉原則的概念有關。
還不熟悉的,可以參考一下前面的文章:
- [ASP.NET]91之ASP.NET由淺入深 不負責講座 Day14 – Object Oriented (1)
- [ASP.NET]91之ASP.NET由淺入深 不負責講座 Day18 – 開放封閉原則
Issues
- 定義
- 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.
- Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
- 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,
- 簡單的說
使用父類的地方,必須可以使用子類別代替,而不需要任何改變。
- 目的
用來規範繼承的標準。
- 原則
- 子類別必須完全實現父類別的方法
- 子類別可以擁有自己不同的屬性與方法
- 要小心參數型別與return型別,型別涵蓋範圍大小造成的問題:override與overload的差異
- 子類別必須完全實現父類別的方法
- 針對違反LSP設計時可行的重構(Refactoring)方式
當Class A錯誤的繼承Class B時:- 可建構一個新的abstract class C,作為2個concrete Class A與B的父類別,也就是多抽象一層來當兩個的父類別,讓A與B在繼承鏈中深度一樣,來避免A繼承B的強耦合與錯誤使用
- 也可以透過委派的方式來解決(分離)A與B的錯誤繼承關係。
- 可建構一個新的abstract class C,作為2個concrete Class A與B的父類別,也就是多抽象一層來當兩個的父類別,讓A與B在繼承鏈中深度一樣,來避免A繼承B的強耦合與錯誤使用
Reference
- http://www.engr.mun.ca/~theo/Courses/ssd/pub/sd-principles-3.pdf
- http://irw.ncut.edu.tw/peterju/se.html
- 設計模式之禪
blog 與課程更新內容,請前往新站位置:http://tdd.best/