我正在使用 SOLID 原則,特別是 Liskov 的替換原則 (LSP)。
我有一個名為的抽象類Button,它定義了不同的方法,不同的子類對其進行了擴展以定義其中一些方法。例如,我有一個子類PauseButton,它只實作抽象類中的 3 個方法。
這是否被認為違反了 LSP?
uj5u.com熱心網友回復:
Liskov 替換原則的核心思想是,只要可以使用型別的實體,就可以使用子型別的實體。子型別可能更專業,但它應該遵守相同的合同。
在您的示例中,PauseButton就Button其所有“方法”(我們在 UML 中說“操作”)是否符合為Button. 這不僅僅是實作方法,而是確保方法兼容:
PauseButton可能沒有強化的前提條件Button。即,如果滿足執行Button方法的條件,您也應該能夠執行相應的PauseButton方法。PauseButton可能不會削弱 的后置條件Button。即,如果Button對方法做出一些承諾, 則PauseButton必須至少履行相同的承諾。- 的不變數
Button(應該始終為真的邏輯條件)也應該是 的不變數PauseButton。PauseButton可能有額外的不變數。 - 歷史約束:粗略的說,就是while
PauseButton是一個Button,PauseButtonmethods不應該直接修改它的Button狀態,不使用的methodsButton。沒有捷徑。
在抽象子類的情況下,驗證 LSP 更加精細,因為我們無法查看直接實體。然而,子類可以通過提供缺失方法的具體子類間接實體化:
- 如果您實作的三種方法中至少有一種
PauseButton違反了 LSP(即與 中的相同方法不兼容Button),那么就PauseButton違反了 LSP。 - 但是,如果所有三種方法都是兼容的,并且如果
PauseButton沒有重新定義其他方法的合同,則可以假設它PauseButton是 LSP-Compliant :您可以創建一個符合 LSP 的具體子類PauseButton,即使在現階段這樣的子類不存在。這滿足了互換性的要求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/424204.html
標籤:遗产 微升 类设计 坚实的原则 liskov-替代原则
