-1

可能重复:
更喜欢组合而不是继承?

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

更具体:

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

或者

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

?

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

有一般建议吗?

4

5 回答 5

3

一般建议不要从标准库容器派生。另请参阅此问题的答案

这个问题的第一个答案给出了关于Liskov 替换原则的注释,这可能是你的答案。

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

于 2012-07-10T07:56:05.590 回答
1

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

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

这个维基百科页面提供了一些解释。

这里也有一个类似的问题

于 2012-07-10T08:02:14.247 回答
0

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

并且通常从不派生自任何标准库容器,这些容器并不意味着基类。


相关参考:

于 2012-07-10T07:56:42.917 回答
0

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

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

另外,检查这个

于 2012-07-10T07:56:50.750 回答
0

我不确定这个问题是否与从 stl 类派生有关,但一般来说,如果类是相关的并且意义完整,我会去派生,以 Car、engine 和 Hybrid Car 类为例

混合动力汽车从汽车内部的汽车和发动机(遏制)派生出来更有意义。在继承的情况下,您可以使用强大的虚函数。

如果要遵循 Open-Close 原则,通常使用继承

于 2012-07-10T07:57:19.493 回答