以下插图是我演讲幻灯片中的示例,我对C ++了解
对于我有一些红宝石知识,Vector就像Array
随机访问而Stack是没有的,所以我似乎继承对我来说是合理的。所以有人能给我一个更简单的例子吗?或解释我的理解有什么问题?
答案 0 :(得分:2)
这是在这种情况下继承不是一个好主意的原因的关键:
Vector is like Array with random access and Stack is the one without
从广义上讲,继承是为了提供其他行为; 删除行为没有合理的方法。
因此,如果Stack
扩展Vector
,它将继承Vector
类提供的随机访问行为(和合同),这是您不想要的。
根据是-a ** 来考虑继承。说Stack
是 Vector
是否有意义?如果没有,那么它不应该扩展Vector
。
您可以使用Stack
实施Vector
与Stack
界面无关。正如@Patashu指出的那样,如果您需要在不更改合同的情况下,您希望能够更改实施。例如,您可能希望使用链接列表实现而不是Vector
。如果你延长Vector
,这是不可能的;如果你使用合成,这是非常微不足道的。
*当然,您可以覆盖方法来删除您不想要的行为,但这会破坏Vector
合同并使您的用户感到非常困惑。这就是为什么这样做通常是不合理的。
* * is-a 有其自身的缺陷,就像软件架构中的任何其他内容一样:请参阅Circle-Ellipse problem,了解为什么在决定哪个时需要特别小心class继承自。
答案 1 :(得分:1)
有助于根据为其他人编写的代码库来考虑它,因此必须支持其他人的使用,或者如果您的代码使用所述其他代码库。当它只是你的代码时,你可以轻松地进行更改,因为你可以控制所有内容,但是如果必须支持其他人,你必须知道哪些更改可以使其他人的代码中断。
1)如果从类继承,则必须支持与该类相同的合同。通过合同,我的意思是面向公众的方法形成了一套班级可以执行的承诺。如果a)它的合同对你的班级来说是笨拙的,那么这可能是不好的b)你从合同中继承的班级会从你下面改变。
2)通过编写而不是继承,您可以更改用于课程实现的内容,而无需进行任何重大的公共更改,因此更快更便宜,就像您决定'我不想使用Vector我的堆栈实现,我想使用DifferentVector代替'它会破坏代码,假设你的堆栈是Vector的子类。
3)另外,即使你没有为你的堆栈使用继承,那么你仍然可以让Stack和Vector实现ICollection接口(例如),允许它们互换使用和多态,这是继承的主要优势。