oop - "composition over inheritance"只是意味着 "If parent class is never be used except in child class, it should be composition"吗?

标签 oop inheritance design-patterns language-agnostic composition

我读过一些关于“组合优于继承”、“在哪里使用组合/继承”、“Is-a 关系...”或“里氏替换原则”一段时间的帖子,但我不确定我是否明白关于“组合优于继承”的正确想法。

或者,根据我的经验,“组合优于继承”似乎只是意味着“如果父类除了子类之外从未被使用,那么它应该是组合”,例如:

public class Parent{
}

public class Child1 extends Parent{
}

public class Child2 extends Parent{
}

如果“Parent”类从未出现在我的代码中(除了 Child1 和 Child2 中),那么 Child1 和 Child2 不应该是 Parent 的子类。

是吗?

最佳答案

组合优于继承意味着您应该执行以下操作,而不是使用父类构建类层次结构并扩展子类:

class Foo {

    protected bar;
    protected baz;

    public function Foo(Bar _bar, Baz _baz) {
        bar = _bar;
        baz = _baz;
    }

}

换句话说,您不是从基父类继承一堆功能,而是从独立对象中获得相同的功能,而不是最好将其依赖项注入(inject)到您的类中。

为什么?因为它提供了更多的灵活性。对于 Foo extends Bar 来说,Bar 提供了一些对一堆继承类有用的基本功能。现在,谁说这个功能对于其他一堆不相关的类没有用处呢?您的所有类都应该继承自Bar吗?由于所有类都继承自 Bar,是否应该将所有常见功能填充到 Bar 中?请不要,这只会导致臃肿、单一、难以维护的基类。

相反,在它们自己的独立类中实现任何有用的通用方法的集合。仅将密切相关的功能分组,将其分为不同的类,这是有意义的。然后将这些对象注入(inject)到其他对象中以组成一个新对象,该新对象可以使用所有共享功能,而无需继承整体基类或定义抽象的严格类层次结构。

只有当类共享相同的“业务逻辑”层次结构时,您才应该继承它们。例如,Cat extends Pet extends Animal 具有完全的逻辑意义。 Cat 扩展了 BaseConnectionManager 则不然。

如果您使用类层次结构进行类型提示,接口(interface)也可以更好、更灵活地实现此目的。

关于oop - "composition over inheritance"只是意味着 "If parent class is never be used except in child class, it should be composition"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33205790/

相关文章:

java - 我如何将对象传递给 Javafx 类以便按程序创建 GUI?

c# - 派生类的 XMLIgnore 属性

java - 单例客户端应该如何使用单例?

multithreading - 多线程设计模式

design-patterns - 将数据从一个grails操作转移到另一个

Python对象显示为map(dict)但无法通过属性或__getitem__调用?

c++ - 如果 C 有结构,为什么它不是 OOP

c++ - 在 C++ 中重载子类中的方法

c# - 与泛型建立关系

c++ - 虚拟继承 - 与其他派生类共享的基础