- 1 簡介
簡介
編輯Liskov替代原則(LSP)是子類型關系的一個特殊定義,稱為強行為子類型,最初由BarbaraLiskov在1988年的會議主題演講中提出,題目是數據抽象和層次結構。它基于可替代性的概念--面向對象編程中的一個原則,即一個對象(比如一個類)可以被一個子對象(比如一個擴展了第 一個類的類)取代而不破壞程序。
這是一種語義上的關系,而不僅僅是語法上的關系,因為它旨在保證層次結構中的類型,特別是對象類型在語義上的互操作性。BarbaraLiskov和JeannetteWing在1994年的一篇論文中簡明扼要地描述了這個原則。
在同一篇論文中,Liskov和Wing詳細介紹了他們在Hoare邏輯擴展中的行為子類型概念,它與BertrandMeyer的契約設計有一定的相似之處,因為它考慮了子類型與前提條件、后置條件和不變量的交互。
PrincipleLiskov的行為子類型概念定義了對象的可替代性概念;也就是說,如果S是T的一個子類型,那么程序中T類型的對象可以被S類型的對象取代而不改變該程序的任何理想屬性(例如正確性)。
行為子類型是一個比類型理論中定義的典型的函數子類型更強的概念,后者只依賴于參數類型的逆向性和返回類型的協變性。行為子類型在一般情況下是不可判定的:如果q是x的方法總是終止的屬性,那么程序(例如編譯器)不可能驗證它對T的某個子類型S成立,即使q對T確實成立。
Liskov替換原則對簽名提出了一些標準要求,這些要求已經被新的面向對象的編程語言所采用(通常是在類的層次上,而不是在類型的層次上;區別見名義與結構子類型)。子類型中的方法參數類型的一致性。子類型中的方法返回類型的一致性。
子類型中的方法不能拋出新的異常,除非它們是超類型的方法拋出的異常的子類型。除了簽名要求之外,子類型必須滿足一些行為條件。這些條件以類似于契約設計方法論的術語詳細說明,導致了對契約與繼承的交互方式的一些限制。
前提條件在子類型中不能被加強。后提條件在子類型中不能被削弱。不變量在子類型中必須被保留。歷史約束(歷史規則)。對象被認為只能通過它們的方法進行修改(封裝)。
因為子類型可以引入超類型中不存在的方法,這些方法的引入可能允許在子類型中進行超類型不允許的狀態改變。歷史約束禁止了這一點。這是由Liskov和Wing引入的新元素。對這個約束的違反可以通過將一個可變的點定義為不可變的點的子類型來說明。
這是對歷史約束的違反,因為在不可變點的歷史中,創建后的狀態總是相同的,所以它不能包括一般的可變點的歷史。然而,添加到子類型中的字段可以被安全地修改,因為它們不能通過超類型的方法來觀察。
因此,我們可以把一個中心不可變、半徑可變的圓定義為不可變點的子類型而不違反歷史約束。起源前后條件的規則與BertrandMeyer在1988年出版的《面向對象的軟件構造》一書中介紹的規則相同。
Meyer和后來的PierreAmerica(他是第 一個使用行為子類型的人)都給出了一些行為子類型概念的證明理論定義,但他們的定義并沒有考慮到在支持引用或指針的編程語言中可能出現的別名問題。
將別名考慮在內是Liskov和Wing的主要改進,其中一個關鍵因素是歷史約束。根據Meyer和America的定義,一個可變點將是一個不可變點的行為子類型,而Liskov的置換原則禁止這種情況。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/164280/