关于如何在面向对象的系统中最好地扩展、增强和重用代码,有两种思路:
继承: 通过创建子类来扩展类的功能。重写子类中的超类成员以提供新功能。当超类想要一个特定的接口但是不知道它的实现时,使方法抽象化/虚拟化来强制子类“填充空白”。
聚合: 通过获取其他类并将它们组合成一个新类来创建新功能。将公共接口附加到这个新类,以便与其他代码进行互操作。
每种方法的好处、成本和后果是什么? 还有其他选择吗?
我看到这场辩论经常被提起,但我不认为有人问过这个问题 堆栈溢出(尽管有一些相关的讨论)。还有一个令人惊讶的缺乏良好的谷歌搜索结果。