讨论出现在这里:
Changing visibility of method in inherited class
问题是:真的是“BTNode扩展GraphNode”设计违反Liskov的Substitution Princeple吗?作为“类似”的例子,它显示了这种情况: Is deriving square from rectangle a violation of Liskov's Substitution Principle?
但我真的不明白为什么会这样。我是一个非常新的设计,有人可以解释为什么(如果)是这样的吗?
答案 0 :(得分:2)
在Is deriving square from rectangle a violation of Liskov's Substitution Principle?中,它基本上表示Square
无法继承Rectangle
,因为您可以使用Rectangle
但不能使用{{{ 1}} - 将宽度设置为与其高度不同的数字。
您无法从Squares
继承BTNode
,因为根据您关联的原始帖子,GraphNode
有一个名为GraphNode
的方法。另一方面,addChild
只能有两个孩子。从BTNode
继承也将继承GraphNode
方法。这允许您将多个子项添加到addChild
,BTNode
无法处理。
因此,BTNode
无法继承BTNode
,因为您可以使用GraphNode
但不能使用GraphNode
进行操作 - 添加多个孩子。
为了完整起见,这里是Wikipedia
中Liskov的替代原则子类型要求:设φ(x)是可证明关于类型T的对象x的属性。然后 φ ( ÿ )对象应该是真的 类型S的y,其中S是T的子类型。
简单来说,
如果你可以在类型T上执行动作X,你还应该能够在T的任何子类上执行动作X.