【发布时间】:2013-01-28 09:07:18
【问题描述】:
作为一名 C++ 程序员,我学到的一个重要且基本的规则是组合优先于继承 (http://en.wikipedia.org/wiki/Composition_over_inheritance)。
我完全同意这条规则,它使事情比使用继承要简单得多。
我有一个问题应该使用 Composition 来解决,但我真的很难做到。
假设您有一个供应商机器,并且您有两种类型的产品:
- 离散产品 - 像零食。
- 流体产品 - 像饮料。
这两种类型的产品需要在一个名为 VendorCell 的类中表示,该类包含单元格内容。
这两个产品共享一些相同的属性(dm),如价格、数量等...但也包含一些不同的属性。
因此在这里使用合成可能会导致以下结果:
class VendorCell {
private : // default access modifier
int price;
int quantity;
// int firstProductAttributeOnly
// char secondProductAttributeOnly
};
如您所见,注释行表明,对于单个 VendorCell 取决于它包含的产品,这两个注释行中只有一个是重要且可用的(另一行仅与另一种类型 - 例如流体)。
因此,我可能有一个 VendorCell,里面有零食,并且不需要它的 secondProductAttributeOnly。
组合(对于 VendorCell)是正确的解决方案吗?对你们来说,有人会通过构造函数确定 VendorCell 类型,而一个 DM(专用于另一种类型的 DM)根本不会被使用(例如,将其标记为 -1),这对你们来说是否合适?>
谢谢大家!
【问题讨论】:
-
嗯?...再说一遍,嗯?为什么不只拥有一个 VendorObject,然后从 VendorObject 继承 VendorSnack 和 VendorDrink。
-
不要为了使用规则或模式而使用规则或模式。使用最合适的;不要弯曲东西以迫使它们进入 unnaturla 模具
-
我认为
vendorcell有一个product和snack是一个product。你明白了吗? -
所以你认为只有在“函数”行为不同时才应该使用继承?我认为这是错误的。多态性不仅仅与函数有关。也是关于数据的。
-
@Marius Bancilla:“也与数据有关”
标签: c++ polymorphism containers smart-pointers