两个child-类可以一起工作吗

Is it possible for two child-classes to work together

我有一个 base-class 命名的产品。 类“饮料”和“披萨”是从“产品”class 继承的子class。 我还有一个名为“Ingredient”的 class,它是 Pizza class 的一部分,因此 Pizza class 应该有一个 Ingredient class 的实例(列表) .

我的问题是: 由于 Ingredient 与所有其他“Products”具有相同的属性,它是否也可以继承“Product”class,同时与“Pizza”subclass一起工作?

是的,他们可以!

是的,继承自同一个超级class的classes可以完美地协同工作。没有不兼容。甚至有一种设计模式在相同的 classes(composite pattern)上使用这两种关系。

备注:“一起工作”的措辞有些含糊,可能表示不同的意思。但是你的 class-图表足够精确并且表明你的意思是可能的关联。

但是如何呢?

您的图表显示了 PizzaIngredient 之间的可导航关联(空心箭头)。这意味着实施应确保披萨可以轻松找到其成分。

在你的叙述中你提到了一个列表。我知道一个 Ingredient 可以没有任何 Pizza,但一个 Pizza 可以有多个 Ingredient。通过在关联的 Ingredient 侧指示 *,在图表上指定此多重性很重要。

反方向的关系还有一些谜团:

  • 未指定导航性:我们不知道 Ingredient 是否能够轻松找到相关的比萨饼,或者这是否不相关。您可以使用相反方向的箭头(可导航)或跨线的 X(不可导航)进一步指定。您有权不指定并稍后决定。可导航性对 classes 协同工作的方式有影响:这意味着 Pizza 可以“使用”配料(例如,将其用作操作中的参数,直接调用配料操作等...)。但是在相反方向上缺乏导航能力意味着 Ingredient 无法单独发起与其比萨饼的合作。
  • 更重要的是多样性:我们不知道一种成分是否只与一个比萨饼相关 (0..1),或者它是否可以在多个披萨之间共享 (0..*)。知道这一点非常重要,因为实现会非常不同(在后一种情况下,您会有多对多关联)。

过度概括?

当发现 OOP 时,继承是很诱人的。然而,继承有很多含义、限制和后果。因此,请明智地使用它。

一个有用的建议是开始考虑 A 继承自 B,前提是 A 是更专门化的 B,或者相反,B 是 A 的更一般化。仅仅因为某些属性或操作共享相同的名称。顺便说一下,名称可能会产生误导。

在您的情况下,我将 Product 理解为公司以给定价格出售的东西:DrinkPizza、可能 AntipastiPasta.显示的价格是客户要求的价格。因此,我想知道是否将 Ingredient 卖给了客户。一种成分可能有价格,但它是购买价格。采购价与销售价不同:假设一家餐厅将一些非常特别的比萨饼转包出去:销售价将与采购价不同。

当然,如果你的Product是比较笼统的,商业意义上的,能有销售价和采购价,而且不一定在菜单上,那没问题,前进。但请注意,此类通用产品的管理要复杂得多(例如,这里有一个著名的 ERP example,有 20 多个不同的屏幕来管理产品的所有方面)。

其他备注

一个非常普遍的建议是prefer composition over inheritance。这个经验法则旨在提醒我们在使用继承之前三思而后行。让我们明确一点,以防万一:这并不意味着继承和组合不兼容。