【问题标题】:Can inheritance always be replaced by composition?继承总是可以被组合代替吗?
【发布时间】:2019-10-06 14:52:10
【问题描述】:

我开始怀疑是否存在不能用组合代替继承的情况?

以一个简单的重载继承为例:

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 都实现了相同的接口,则更明显的是上面的两个sn-ps 等同于相同的行为。

那么,回到最初的问题:是否存在必须(或真的、真的应该)使用继承而不是组合的情况?

【问题讨论】:

标签: oop inheritance language-agnostic composition


【解决方案1】:

是否存在不能用组合代替继承的情况?

不!但请考虑:

是否存在继承不应该被组合替换的情况?

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

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

【讨论】:

    【解决方案2】:

    是否存在必须(或真的、真的应该)使用继承而不是组合的情况?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 2011-03-04
      • 2013-04-06
      • 1970-01-01
      相关资源
      最近更新 更多