提问人:manabreak 提问时间:5/20/2019 最后编辑:Michaelmanabreak 更新时间:5/21/2019 访问量:64
继承总是可以被组合物取代吗?
Can inheritance always be replaced by composition?
问:
我开始在想,有没有不能用组合代替继承的情况?
以重载的简单继承为例:
class Foo {
String getText() {
return "Text from foo";
}
}
class Bar extends Foo {
@Override
String getText() {
return "BAR> " + super.getText() + " <BAR";
}
}
这可以用这样的组合代替:
class Bar {
Foo foo;
String getText() {
return "BAR> " + foo.getText() + " <BAR";
}
}
...导致完全相同的结果。如果两者都实现了相同的接口,则上面的两个代码片段等于相同的行为变得更加明显。Foo
Bar
所以,回到最初的问题:是否有任何情况必须(或真的,真的应该)使用继承而不是组合?
答:
0赞
Spotted
5/20/2019
#1
有没有一种情况必须(或者真的,真的应该)使用继承而不是组合?
当某些行为是抽象的时,用继承来表达它比试图用看起来不自然/令人困惑的构图来表达它更有意义。
0赞
Nghia Bui
5/21/2019
#2
有没有不能以组合代替继承的情形?
不!但请考虑:
有没有不宜以组合代替继承的情形?
是的!想象一下,你的类有 10 个方法。使用组合,您必须重写 中的这 10 个方法。代码可能很简单,因为它将大部分任务委托给,但它仍然非常令人沮丧。Foo
Bar
Foo
我不会谈论人们所说的“是A”或“有A”,因为这对我来说没有意义。就我个人而言,我认为继承/组合都是关于代码重用的。是什么让你在你的情况下更容易重用代码,使用它。编程中的继承与分类无关,我通常会发现类比 // ...没有帮助。Animal
Dog
Cat
上一个:在我的设计中对继承与否感到困惑
下一个:总和为 k 的子数组的最小大小
评论