我正在使用聚合和组合创建用于模拟的实体。
在以下 C++ 示例中:
class CCar
{
CCar( CDriver* pDriver )
{ m_pDriver = pDriver; }
CDriver* m_pDriver;
CEngine m_Engine;
CDriverControls m_Controls;
};
在上面的例子中,一辆汽车由一个发动机和一组驾驶控制装置(按组合)组成。汽车还必须有驾驶员(通过聚合)。
但这仅解释了层次关系 - 驾驶员属于汽车,发动机和控件也属于汽车。但这些成员也彼此相关 - 驾驶员必须对控件执行操作,控件必须对发动机执行操作。这些关系还可以在多个方向发挥作用 - 发动机可能熄火并导致控制装置失灵,或者控制装置可能会疯狂旋转并伤害驾驶员?如果驾驶员不喜欢发动机的声音并离开汽车怎么办?这些关系如何运作?
我正在组合来自许多不同对象的许多不同实体,这些对象经常与其他对象交互,并且对如何以设计的方式管理这些关系感兴趣。
谢谢!
编辑:
正如答复所建议的,管理此问题的一种方法是将汽车指向驾驶员,并向驾驶员提供指向汽车的指针,等等。这是有道理的,可以解决这个特定的示例。然而,从设计的角度来看,这增加了驾驶员的责任,该对象的任务是跟踪它属于哪辆车,但这肯定是容器的职责来跟踪哪些对象属于一起?同样,让 CCar 负责管理这些关系也会将 CCar 变成一个 blob。是否有设计好的解决方案来处理此类关系?
最佳答案
您将它们构建到每个类的方法中。您所描述的是每个类(class)的行为。您的要求表明这种关系也是双向的。您的 Controls 类将具有采用 Engine 参数并调用其方法的方法。发动机将对其转速、马力、扭矩等进行限制,由 Controller 操纵,这些 Controller 将内置限制(例如,“如果您的转速降得太低,就会失速”)。
这不仅仅是构图。您将行为和规则构建到方法中。这些方法可能采用表达您需要的参数。
关于c++ - 管理类的聚合/组合成员之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/932435/