为什么组合优于继承?


过度(滥用)继承一直是OO的最大问题之一。
组合可以在OO或FP中实现,对FP的了解(哪怕是一点点)可以积极地影响你如何写OO代码。

继承不应该是学生们学习的第一件事,但它却是。
我看到很多初学者从第一天开始就接触到这种垃圾。它是这样的:hello world、变量、加数字、打印数字、面向对象的编程与继承,该死的中间地带在哪里?

"狗是哺乳动物,但猫也是哺乳动物,所以狗叫喵,猫叫汪"。嗯,是的,在现实世界的领域建模和软件工程中多么美妙的帮助。

一个好的中间地带实际上是依赖注入,你没有使用继承,而且一个类的依赖关系是预先和明显的。
我可以注入一些新的行为,甚至删除一些行为,而不需要把继承树搞得层层深入。
如果有人因此对你说三道四,那么就说这实现了SOLID中的D。

组合优于继承并不意味着“永远不要使用继承”
问题是大多数开发人员并不擅长 API 设计,即使经过数十年的编程也是如此。任何缺乏经验然后着手发布可扩展类的人都可能做得很糟糕。
组合更容易正确,但归根结底,糟糕的设计师会做错事,无论他们使用继承还是组合。
我怀疑密封类将在保护开发人员免受不可预见的扩展方面大有帮助。
最后,任何使用继承来重用实现的人都做错了:
继承是关于表达关系,而不是代码重用。
如果你想重用代码,那么组合才是正确的方法。