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()方法应该返回元素的数量,而不管这些元素如何存储。 )

的基类不一定有接口的任何(更不用说所有)派生类的所以它是没有意义的,以期待一个基类的任意引用是为替代一个指定的派生类。即使看起来只需要基类接口支持的接口的子集,也可能不是这种情况(例如,可能会引用特定派生类中的遮蔽方法)。