2017-08-26 29 views
0

的BinaryTreeNode从GraphNode的讨论出现在这里:是推导违反里氏的换人Princple

Changing visibility of method in inherited class

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

但我真的不明白为什么这是相似的。我很新设计,有人可以解释我为什么(如果)是这种情况?

回答

2

Is deriving square from rectangle a violation of Liskov's Substitution Principle?,它基本上说,Square不能从Rectangle继承,因为有事情,你可以用Rectangle就做,但不与Squares - 从它的高度宽度设置为不同的数字。

您不能从GraphNode继承BTNode,因为根据您链接的原始帖子,GraphNode有一个名为addChild的方法。另一方面,BTNode,只能有两个孩子。继承GraphNode也将继承addChild方法。这允许您将多个子项添加到BTNode,这是BTNode无法处理的。添加多个孩子 -

因此,BTNode不能从GraphNode,因为有事情,你可以做GraphNode秒,但不与BTNode小号继承。

为了完整起见,这里是Wikipedia

亚型需求的里氏的替换原则:让φ(X)是一个财产证明的有关类型T的对象X,则 φ ( Ÿ )应对于对象真正 Y型S的其中S是T.

的子类型

简单来说,

如果你能做到在T型动作X,你也应该能够做T.

+0

的任何子类动作X是否儿童限制数量也不会解决这个问题?它可以通过以下两种方式之一完成:向GraphNode添加numberOfChildrenRestricion标志(显示特定graphNode可能有多少个子项),或者通过在BTNode中重写addChild,以便它不允许添加多于两个子项(并且,例如,抛出异常)? – Malvinka

+0

如果我决定不从GraphNode派生BTNode,它意味着基本上将整个代码(但是addChild方法)从一个类重写到另一个类 - 这似乎并不合理...... – Malvinka

+1

@Malvinka不,“BTNode”特别具有一个孩子在左边,一个在右边。 addChild'将添加一个孩子到哪个方面是不明确的。 – Sweeper