继承总是可以被组合物取代吗?

Can inheritance always be replaced by composition?

提问人:manabreak 提问时间:5/20/2019 最后编辑:Michaelmanabreak 更新时间:5/21/2019 访问量:64

问:

我开始在想,有没有不能用组合代替继承的情况?

以重载的简单继承为例:

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

所以,回到最初的问题:是否有任何情况必须(或真的,真的应该)使用继承而不是组合?

OOP 继承与 语言无关的 组合

评论

0赞 Stephen C 5/20/2019
将一个问题标记为“java”和“语言不可知”是没有意义的:fixed。
3赞 Michael 5/20/2019
继承可以完全被组合取代吗?

答:

0赞 Spotted 5/20/2019 #1

有没有一种情况必须(或者真的,真的应该)使用继承而不是组合?

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

0赞 Nghia Bui 5/21/2019 #2

有没有不能以组合代替继承的情形?

不!但请考虑:

有没有不以组合代替继承的情形?

是的!想象一下,你的类有 10 个方法。使用组合,您必须重写 中的这 10 个方法。代码可能很简单,因为它将大部分任务委托给,但它仍然非常令人沮丧。FooBarFoo

我不会谈论人们所说的“是A”或“有A”,因为这对我来说没有意义。就我个人而言,我认为继承/组合都是关于代码重用的。是什么让你在你的情况下更容易重用代码,使用它。编程中的继承与分类无关,我通常会发现类比 // ...没有帮助。AnimalDogCat