簡介
編輯里氏替代原則 (LSP) 是子類型關系的特定定義,稱為強行為子類型,最初由 Barbara Liskov 在 1988 年題為數據抽象和層次結構的會議主題演講中引入。
它基于可替換性的概念——面向對象編程中的一個原則,指出一個對象(例如一個類)可以被一個子對象(例如一個擴展第 一個類的類)替換而不會破壞程序。
它是一種語義關系,而不僅僅是句法關系,因為它旨在保證層次結構中類型(尤其是對象類型)的語義互操作性。
芭芭拉·利斯科夫 (Barbara Liskov) 和珍妮特·溫 (Jeannette Wing) 在 1994 年的一篇論文中簡要描述了該原理,如下所示:
子類型要求:設 ? ( x ) {displaystyle phi (x)} 是關于類型 T 的對象 x {displaystyle x} 的可證明屬性。然后 ? ( y ) {displaystyle phi (y )} 對于類型 S 的對象 y {displaystyle y} 應該為真,其中 S 是 T 的子類型。
也就是說,如果 S 是 T 的子類型,則適用于 T 對象的內容也適用于 S 對象。在同一篇論文中,Liskov 和 Wing 在 Hoare 邏輯的擴展中詳細描述了他們的行為子類型概念,這與 Bertrand Meyer 有一定的相似之處 的契約設計,因為它考慮了子類型與先決條件、后置條件和不變量的相互作用。
原則
編輯Liskov 的行為子類型概念定義了對象可替代性的概念; 也就是說,如果 S 是 T 的子類型,則程序中類型 T 的對象可以替換為類型 S 的對象,而不會改變該程序的任何所需屬性(例如正確性)。
行為子類型化是比類型論中定義的典型函數子類型化更強大的概念,后者僅依賴于參數類型的逆變性和返回類型的協變性。
行為子類型通常是不可判定的:如果 q 是 x 的屬性方法總是終止,那么程序(例如編譯器)不可能驗證它對 T 的某些子類型 S 是否成立,即使 q 對 T 成立。盡管如此,該原則在推理類層次結構的設計時還是很有用的。
里氏替代原則對更新的面向對象編程語言中采用的簽名施加了一些標準要求:
- 子類型中方法參數類型的逆變。
- 子類型中方法返回類型的協變。
- 子類型中的方法不能拋出新異常,除非它們是超類型方法拋出的異常的子類型。
除了簽名要求外,子類型還必須滿足許多行為條件。這些在類似于契約設計方法的術語中進行了詳細說明,從而導致對契約如何與繼承交互的一些限制:
- 前提條件不能在子類型中加強。
- 不能在子類型中弱化后置條件。
- 子類型中必須保留不變量。
- 歷史約束(歷史規則)。對象被認為只能通過它們的方法(封裝)進行修改。因為子類型可能會引入超類型中不存在的方法,所以這些方法的引入可能會允許子類型中的狀態更改,而這在超類型中是不允許的。歷史約束禁止這樣做。這是 Liskov 和 Wing 引入的新穎元素。可以通過將可變點定義為不可變點的子類型來舉例說明違反此約束的情況。這違反了歷史約束,因為在不可變點的歷史中,創建后狀態始終相同,因此它不能包含一般可變點的歷史。但是,可以安全地修改添加到子類型的字段,因為它們無法通過超類型方法觀察到。因此,可以在不違反歷史約束的情況下,將具有不可變中心和可變半徑的圓定義為不可變點的子類型。
起源
編輯前置條件和后置條件的規則與 Bertrand Meyer 在其 1988 年出版的《面向對象的軟件構造》一書中介紹的規則相同。
Meyer 和后來第 一個使用行為子類型化術語的 Pierre America 都給出了一些行為子類型化概念的證明理論定義,但他們的定義沒有考慮支持引用或指針的編程語言中可能出現的別名。
考慮別名是 Liskov 和 Wing (1994) 所做的主要改進,其中一個關鍵因素是歷史約束。根據 Meyer 和 America 的定義。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/198112/