为什么更喜欢组合而不是继承?每种方法都有哪些取舍?什么时候应该选择继承而不是组合?
更喜欢组合而不是继承,因为它更具延展性/以后易于修改,但不要使用始终组合的方法。通过组合,可以很容易地通过依赖注入/设置器来动态改变行为。继承更加严格,因为大多数语言不允许您从一种以上的类型派生。因此,一旦您从 TypeA 派生,鹅或多或少就已经煮熟了。
我对上述内容的酸性测试是:
TypeB 是否想要公开 TypeA 的完整接口(所有公共方法不少于),以便可以在预期 TypeA 的地方使用 TypeB?表示继承。
例如,塞斯纳双翼飞机将暴露飞机的完整界面,如果不是更多的话。所以这使它适合从飞机派生。 TypeB 是否只需要 TypeA 公开的部分/部分行为?表示需要组合。
例如,鸟可能只需要飞机的飞行行为。在这种情况下,将其提取为接口/类/两者并使其成为两个类的成员是有意义的。