不管一个物体在物理上是否存在,我们可以选择以不同的方式对它进行建模。在许多情况下,我们可以套利地使用概括或组合。然而,GoF的“偏重合成而非泛化碳化硅”原则指导我们使用构图。因此,例如,当我们建模一条线时,我们创建一个包含两个成员的类( PointA和PointB类型为Point (组合)),而不是扩展点(泛化)。尽管对象通常要复杂得多,但这只是一个简单的示例,说明了我们如何能够仲裁地选择组合或继承来建模。
我们如何知道这是正确的选择?至少这很重要,因为如果是错误的话,可能会有大量的重构工作要做?
发布于 2011-04-10 12:30:30
这并不总是正确的选择。在大多数情况下,这是有利的。当复合模型需要更改或扩展时,它对此的抵抗力要大得多,因为您可以更改组合,而不必担心会无意中影响其他类。
我们怎么知道的?从经验,和别人的经验。
我已经看到了许多情况,在这种情况下,大规模的类层次结构是从一个简单的概念开始的,而这正是您的主要重构变得必要的地方。同时,我从未见过组合结构需要重构为继承的情况。
但我的轶事证据不应该足够。只要环顾互联网,很多人都有过同样的经历。
发布于 2011-04-10 17:41:18
如果您想要一个更强大的经验规则,而不是“偏爱组合而不是继承”,那么我可能会建议如下:
在专门化对象的两种方法--继承和组合--中,只有当您需要对您要专门化的基类具有多态(可替换性)时,才应该使用继承。
然而,就像所有的经验法则一样,一旦你理解了这个规则,你就可以自由地打破这个规则了:)
发布于 2011-04-10 12:44:42
我看不出合成和泛化是如何替代和找不到报价。
组合和继承是(为了实现专业化),可以说抽象和泛化是(实现模块化)。
你想要的是你的设计是简单和合理的,这是两个本质上相当容易衡量的品质。
在你的例子中,由两点组成一条线似乎更有道理,而不是扩展它,因为你会自然地用两点来定义一条线,而不是通过扩展一个点的概念。
https://softwareengineering.stackexchange.com/questions/66879
复制相似问题