2010-09-05 44 views
1

我遇到了里氏替換原則的聲明原件來到沃德的wiki今晚原始語句的方向性:里氏替換原則和

這到底是怎麼想的東西像下面的替代屬性:如果每個S類型的對象o1有一個類型爲T的對象o2,因此對於所有按照T定義的程序P,當o1代替o2時,P的行爲不變,那麼S是T的一個子類型。「 - Barbara Liskov,數據抽象和層次結構,SIGPLAN公告,23,5(1988年5月)。

我一直都在ŝ被垃圾在解析謂詞邏輯(我沒有計算器IV第一次雖然),所以當我有點理解了上面如何翻譯爲:使用指針或引用基類必須能夠使用

功能派生類的對象不知道它。

我不明白的是爲什麼Liskov屬性描述的意思是S是T的一個子類型而不是其他方式。

也許我對OOP還不夠了解,但爲什麼Liskov的聲明只允許S→T而不是T→S的可能性呢?

+0

相關:[類型 - 子類型關係。東西似乎不清楚。](http://stackoverflow.com/questions/2268018/type-subtype-relation-something-seems-unclear) – sepp2k 2010-09-05 12:59:35

回答

0

假設的程序集P(以T表示)沒有用S來定義,因此它對S沒有多少說明。另一方面,我們確實說S和T一樣工作在那組程序P中,所以我們可以得出關於S及其與T的關係的結論。

想到這一點的一種方式是P要求T的某些屬性恰好滿足這些性質。也許你甚至可以說'S中的每個o1都在T'。這個結論用於定義亞型字。

0

正如sepp2k所指出的,在另一篇文章中有多個視圖解釋了這一點。 這是我的兩分錢。 我喜歡這樣看

如果對於TallPerson類型的每個對象o1都有一個Person類型的對象o2,那麼對於所有以Person定義的程序P來說,當o1是取代o2,那麼TallPerson是Person的一個子類型。 (用TallPerson和T替換S與Person)

我們通常有一個派生某些基類的對象的透視圖,它具有更多的功能,因爲它的擴展。然而,隨着更多的功能,我們正在對其進行專門化,並縮小它們可以使用的範圍,從而成爲其基類(更廣泛類型)的子類型。

0

派生類繼承其基類的公共接口,並期望使用繼承的實現或提供類似行爲的實現(例如,Count()方法應該返回元素的數量,而不管這些元素如何存儲。 )

的基類不一定有接口的任何(更不用說所有)派生類的所以它是沒有意義的,以期待一個基類的任意引用是爲替代一個指定的派生類。即使看起來只需要基類接口支持的接口的子集,也可能不是這種情況(例如,可能會引用特定派生類中的遮蔽方法)。