继承总是可以被组成代替吗?

时间:2019-05-20 08:57:26

标签: oop inheritance language-agnostic 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";
    }
}

...导致完全相同的结果。如果FooBar都实现相同的接口,则上面的两个代码片段具有相同的行为就变得更加明显。

那么,回到最初的问题:在任何情况下,必须(或者确实应该)使用继承而不是合成吗?

2 个答案:

答案 0 :(得分:0)

  

在任何情况下,必须(或者确实应该)使用继承而不是合成吗?

当某种行为是抽象的时,用继承来表达它比试图用看起来不自然/令人困惑的合成来表达更有意义。

答案 1 :(得分:0)

  

在任何情况下继承都不能被合成代替吗?

不!但是请考虑:

是否在任何情况下都不能用组合替换继承

是的!想象一下您的Foo类有10个方法。使用合成,您必须在Bar中重写这10种方法。该代码可能很简单,因为它会将大多数任务委托给Foo,但仍然很令人沮丧。

我不会谈论人们所说的“是A”或“具有A”,因为这对我来说没有意义。我个人认为继承/组合全部与代码重用有关。是什么让您在特定情况下更容易重用代码,请使用它。编程中的继承与分类法无关,我通常会发现类似Animal / Dog / Cat之类的类比...无济于事。