什么是更好的:派生或包含?

时间:2012-07-10 07:53:35

标签: c++ oop

  

可能重复:
  Prefer composition over inheritance?

我最近多次偶然发现的一个普遍问题:派生的优点和缺点与包含相比有哪些?

更具体一点:

class A : public std::vector<int> {};

class B {public: std::vector<int> elem;}

当然,在生产代码中,我会将elem声明为私有,并实现公共getter和setter。

是否有一般性建议?

5 个答案:

答案 0 :(得分:3)

一般建议不要从标准库容器派生。另请参阅this questions answers

这个问题的第一个答案给出了关于Liskov substitution principle的注释,这可能是你的答案。

  

可替代性是面向对象编程的一个原则。它指出,在计算机程序中,如果S是T的子类型,则类型T的对象可以用类型S的对象替换(即,类型S的对象可以替换类型为T的对象)而不改变任何该程序的理想属性(正确性,执行任务等)。

答案 1 :(得分:1)

组合意味着has-a关系,而继承意味着is-a关系。

虽然您应该选择更能反映这种关系的那种,但一般建议使用composition

Wikipedia page提供了一些解释。

这里也有类似的SO question

答案 2 :(得分:0)

始终努力减少与客户的最小耦合。您公开的实体越多,可以将更复杂的客户端代码绑定到您的库,并且提供将来的更改和中断依赖项就越困难。

通常永远不会从任何标准库容器派生,这些容器不是基类。


相关参考文献:

答案 3 :(得分:0)

您需要根据当前的任务,需求,要求等做出选择。

你提出的问题太笼统了。但是,通常,从std类派生并不是一个好主意。

另外,请检查this

答案 4 :(得分:0)

我不确定这个问题是否与从stl类派生相关,但一般来说,如果类是相关的并且意思是完整的,我会去推导出来,举个类Car,engine和Hybrid Car的例子

混合动力汽车更有意义来自汽车和发动机在汽车内(遏制)。在继承的情况下,您可以使用强大的虚拟功能。

如果您想遵循开放式关闭原则

,通常会使用继承