在一本书中,它说
类Name具有属性 姓氏和名字。
地址继承自Name,并且具有 街道号码的附加财产, 街道名称,城市,州,邮政编码。
这似乎与其他情况不同,
Cat继承自Animal,而Cat“is-a”Animal。
对于良好的对象设计,这是“必须”还是强制性的关系?地址应该从名称继承吗?
更新:,因为有些用户要求提供来源: alt text http://img192.imageshack.us/img192/8903/learningrubyp133smaller.png
答案 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”的同义词。