我读过一些关于“组合优于继承”、“在哪里使用组合/继承”、“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/