为什么更喜欢组合而不是继承?每种方法有哪些权衡取舍?什么时候应该选择继承而不是组合?
最佳答案
优先使用组合而不是继承,因为它更具延展性/以后更容易修改,但不要使用始终组合的方法。通过组合,可以很容易地通过依赖注入(inject)即时更改行为/二传手。继承更加严格,因为大多数语言不允许您从一种以上的类型派生。因此,一旦您从 TypeA 派生,鹅或多或少就会煮熟。
我对上面的酸性测试是:
TypeB 是否要公开 TypeA 的完整接口(interface)(所有公共(public)方法),以便可以在需要 TypeA 的地方使用 TypeB?表示继承。
- 例如塞斯纳双翼飞机将暴露飞机的完整接口(interface),如果不是更多的话。所以这使得它适合从飞机派生。
TypeB 是否只想要 TypeA 公开的部分/部分行为?表示需要组合。
- 例如鸟可能只需要飞机的飞行行为。在这种情况下,将其作为接口(interface)/类/两者提取出来并使其成为这两个类的成员是有意义的。
更新: 刚刚回到我的回答,现在看来如果没有具体提及 Barbara Liskov 的 Liskov Substitution Principle 是不完整的作为“我应该从这种类型继承吗?”的测试
关于language-agnostic - 更喜欢组合而不是继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32031921/