language-agnostic - 更喜欢组合而不是继承?

标签 language-agnostic oop inheritance composition aggregation

为什么更喜欢组合而不是继承?每种方法有哪些权衡取舍?什么时候应该选择继承而不是组合?

最佳答案

优先使用组合而不是继承,因为它更具延展性/以后更容易修改,但不要使用始终组合的方法。通过组合,可以很容易地通过依赖注入(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/

相关文章:

sockets - 套接字的同步程度如何?

C++类——如何从另一个成员函数引用一个成员函数

nhibernate - NHibernate Mapping-by-Code 的每个子类继承映射表

c++ - 虚拟方法 C++

multithreading - 什么时候多线程不是一个好主意?

security - 您在编写自己的密码学方法时使用哪些技术?

java - 我什么时候会在 Java 中使用类变量与实例变量?

java - 为什么方法体内的 boolean 标志是一个坏主意?

c++ - 从基类继承了什么?

ruby - 什么是触发器运算符?