当B类继承自A类时,它必须是“B级是 - A级”吗?

时间:2009-06-08 09:55:05

标签: oop

在一本书中,它说

  

类Name具有属性   姓氏和名字。

     

地址继承自Name,并且具有   街道号码的附加财产,   街道名称,城市,州,邮政编码。

这似乎与其他情况不同,

Cat继承自Animal,而Cat“is-a”Animal。

对于良好的对象设计,这是“必须”还是强制性的关系?地址应该从名称继承吗?

更新:,因为有些用户要求提供来源: alt text http://img192.imageshack.us/img192/8903/learningrubyp133smaller.png

6 个答案:

答案 0 :(得分:13)

不,我不认为该地址应该继承自Name。除了一个字符串字段外,它们没有任何共同之处。地址不应该有姓氏。

只有在存在强烈且清晰的关系时才会使用继承性,其中一些行为被扩展。

人们应该支持组合而不是继承,因为它允许松散耦合和动态的行为改变。

答案 1 :(得分:4)

是的,继承完全是“is-a”关系。在Name和Address的情况下,拥有一个具有Name和Address类型的成员变量的复合类Person可能会更优雅。

但是对于确实每个Address类的实体也具有与Name类相同的属性的情况,继承是可以接受的。同样,这取决于它如何在真正的问题中起作用,这不是一般性问题。

答案 2 :(得分:4)

在这种情况下,你的书滥用面向对象只是为了节省必须重新定义一些变量。从概念上讲,地址“是一个”名称并不是真的。让Address对象包含对Name对象(给定地址的驻留)的引用会更自然。

答案 3 :(得分:2)

是。 当你的B类是A类时,你可以使用继承。也就是说,在这种情况下,让B类成为A类的子类是可以的。

在这种关系不明确的情况下,你应该考虑组合而不是继承。 (有一种关系,而不是一种关系)。

也就是说,你书中的例子感觉不对。 地址不是名字。 Adress可以有一个名字,所以应该使用组合。

答案 4 :(得分:2)

如果可以在预期A类的地方使用B类,那么你就具有“is-a”继承(参见Liskov substitution principle)。否则,您只需使用新行为扩展一个类
地址可以继承自Name类(我不同意)但你不应该视为名称。

答案 5 :(得分:2)

一般来说:如果D类继承自B类,那么D就是B。

在C ++中:如果D类从B类继承私有,则D不是B,因为没有人知道。 Stroustrup认为这是作品的替代品。我认为这是C ++设计中的错误之一,正是因为在我的理解中,“inherits”应该是“is a”的同义词。