谁能给我一个简单的例子来证明继承实现是邪恶的?

时间:2013-05-29 05:27:24

标签: oop composition

以下插图是我演讲幻灯片中的示例,我对C ++了解

对于我有一些红宝石知识,Vector就像Array随机访问而Stack是没有的,所以我似乎继承对我来说是合理的。所以有人能给我一个更简单的例子吗?或解释我的理解有什么问题?

enter image description here

2 个答案:

答案 0 :(得分:2)

这是在这种情况下继承不是一个好主意的原因的关键:

Vector is like Array with random access and Stack is the one without

从广义上讲,继承是为了提供其他行为; 删除行为没有合理的方法。

因此,如果Stack扩展Vector,它将继承Vector类提供的随机访问行为(和合同),这是您不想要的。

根据是-a ** 来考虑继承。说Stack Vector是否有意义?如果没有,那么它不应该扩展Vector

您可以使用Stack实施VectorStack界面无关。正如@Patashu指出的那样,如果您需要在不更改合同的情况下,您希望能够更改实施。例如,您可能希望使用链接列表实现而不是Vector。如果你延长Vector,这是不可能的;如果你使用合成,这是非常微不足道的。

*当然,您可以覆盖方法来删除您不想要的行为,但这会破坏Vector合同并使您的用户感到非常困惑。这就是为什么这样做通常是不合理的。

* * is-a 有其自身的缺陷,就像软件架构中的任何其他内容一样:请参阅Circle-Ellipse problem,了解为什么在决定哪个时需要特别小心class继承自。

答案 1 :(得分:1)

有助于根据为其他人编写的代码库来考虑它,因此必须支持其他人的使用,或者如果您的代码使用所述其他代码库。当它只是你的代码时,你可以轻松地进行更改,因为你可以控制所有内容,但是如果必须支持其他人,你必须知道哪些更改可以使其他人的代码中断。

1)如果从类继承,则必须支持与该类相同的合同。通过合同,我的意思是面向公众的方法形成了一套班级可以执行的承诺。如果a)它的合同对你的班级来说是笨拙的,那么这可能是不好的b)你从合同中继承的班级会从你下面改变。

2)通过编写而不是继承,您可以更改用于课程实现的内容,而无需进行任何重大的公共更改,因此更快更便宜,就像您决定'我不想使用Vector我的堆栈实现,我想使用DifferentVector代替'它会破坏代码,假设你的堆栈是Vector的子类。

3)另外,即使你没有为你的堆栈使用继承,那么你仍然可以让Stack和Vector实现ICollection接口(例如),允许它们互换使用和多态,这是继承的主要优势。