我开始怀疑是否存在无法用组合代替继承的情况?
以带有重载的简单继承为例:
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 :(得分:0)
在任何情况下,必须(或者确实应该)使用继承而不是合成吗?
当某种行为是抽象的时,用继承来表达它比试图用看起来不自然/令人困惑的合成来表达更有意义。
答案 1 :(得分:0)
在任何情况下继承都不能被合成代替吗?
不!但是请考虑:
是否在任何情况下都不能用组合替换继承 ?
是的!想象一下您的Foo
类有10个方法。使用合成,您必须在Bar
中重写这10种方法。该代码可能很简单,因为它会将大多数任务委托给Foo
,但仍然很令人沮丧。
我不会谈论人们所说的“是A”或“具有A”,因为这对我来说没有意义。我个人认为继承/组合全部与代码重用有关。是什么让您在特定情况下更容易重用代码,请使用它。编程中的继承与分类法无关,我通常会发现类似Animal
/ Dog
/ Cat
之类的类比...无济于事。