what
liskov substitution principle(lsp),任何父類出現的地方,子類一定可以出現。
why
lsp是ocp原則的規範。ocp原則的關鍵的是抽象,而繼承關係又是抽象的一種具體表現。
how
當子類不能完整的實現父類父類的方法,那麼建議斷開父子關係,採用依賴,聚合,組合等關係替代繼承。下面是乙個經典例子,鴕鳥不是鳥
抽象鳥類,這裡我們認為鳥類都會飛,抽象方法是獲取飛行速度
abstractclass
bird : ifly
protected
abstract
double
getflightspeed();
//飛行一段距離所需時間
public
double fly(double
distance)
}
燕子類,飛行速度是120
classswallow : bird
}
鴕鳥類,鴕鳥不會飛,那麼飛行速度是0
classostrich : bird
}
客戶端呼叫
classprogram
}
這樣看是沒有問題的,但是當換成下列這樣的情況
classprogram
}
這樣就是違反了lsp,因為鴕鳥並不能實現所有的鳥類功能,因為它不會飛,所以沒有飛行速度,那麼將來客戶端呼叫的使用,當成一種鳥類飛行,就會造成不可預知的錯誤。
為什麼會造成這樣的情況,其實是因為抽象封裝的時候出現了問題,從生態學上來說有翅膀、有羽毛等特點的就是鳥,那麼會飛的鳥應該是鳥類的乙個分支,所以我們應該重新劃分類的職責範圍
abstractclass
bird
}
abstractclass
flybird : bird, ifly
}
classprogram
}
設計模式 之黎克特制替換原則
一 定義 所有引用基類的地方必須能透明的使用其子類的物件。怎麼理解呢?簡單來說,只要父類能出現的地方子類就可以出現,而且替換後不會產生任何錯誤或者異常,反之不然!二 好處 這樣設計的程式,健壯性大大增加,版本公升級時也可以保持非常好的相容性,及時增加子類,原有子類也可以繼續執行而不會受到影響。三 示...
設計模式之黎克特制替換原則
黎克特制替換原則的定義 黎克特制替換原則 liskov substitution principle,lsp 由麻省理工學院電腦科學實驗室的裡斯科夫 liskov 女士在 1987 年的 物件導向技術的高峰會議 oopsla 上發表的一篇文章 資料抽象和層次 data abstraction and...
設計模式 黎克特制替換原則
設計模式 黎克特制替換原則 物件導向的語言繼承必不可少的,有如下優點 共享,減少建立類的工作量 提高 的重用性 提高 的可擴充套件性 提高 的可擴充套件性 提高產品 的開放性 繼承侵入性 只要繼承,必須擁有父類的內容 降低 的靈活性,子類必須擁有父類的屬性和方法 增強耦合性。黎克特制替換原則,為繼承...