从GraphNode派生BinaryTreeNode违反了Liskov的Substitution Princple

时间:2017-08-26 15:51:09

标签: oop liskov-substitution-principle

讨论出现在这里:

Changing visibility of method in inherited class

问题是:真的是“BTNode扩展GraphNode”设计违反Liskov的Substitution Princeple吗?作为“类似”的例子,它显示了这种情况: Is deriving square from rectangle a violation of Liskov's Substitution Principle?

但我真的不明白为什么会这样。我是一个非常新的设计,有人可以解释为什么(如果)是这样的吗?

1 个答案:

答案 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方法。这允许您将多个子项添加到addChildBTNode无法处理。

因此,BTNode无法继承BTNode ,因为您可以使用GraphNode但不能使用GraphNode 进行操作 - 添加多个孩子。

为了完整起见,这里是Wikipedia

中Liskov的替代原则
  

子类型要求:设φ(x)是可证明关于类型T的对象x的属性。然后   φ   (   ÿ   )对象应该是真的   类型S的y,其中S是T的子类型。

简单来说,

  

如果你可以在类型T上执行动作X,你还应该能够在T的任何子类上执行动作X.