组合

在基于对象的系统中处理复杂性的主要方式是通过对象分解。对象可以由其他对象或子对象(嵌套的对象)组成。子对象是定义在父对象中的对象。父对象(或所有者)可以代理将由其子对象处理的请求,并且子对象可以将信息发送回父对象。

每个子对象将 HomeHeatingSystem 作为其父对象,而 HomeHeatingSystem 可以根据名称访问它的每个子对象。HomeHeatingSystem 的这个视图称作对象结构视图,因为它显示了对象的内部结构。根据系统的性质,子对象之间可以互相链接,或者不链接。

在组合中,父对象保留子对象的值,而不是指针。父对象负责在子对象之后进行初始化和清除。请参阅初始化子对象以了解更多信息。

缺省情况下,子对象会指定单个实例并作为父对象结构的成员来实施。成员的名称和类型与子对象的名称和类型相同。换言之,子对象通过值嵌入在父对象中,而不是指向对象的指针。

当子对象的多重性指定为大于 1 的数字时,子对象会在缺省情况下实施为数组。例如,theFurnacetheRooms 实施为 HomeHeatingSystem 结构的成员。对象 theFurnace 实施为类型 Furnace 的单个实例,而 theRooms 实施为三个 Rooms 的数组:

typedef struct HomeHeatingSystem HomeHeatingSystem;
struct HomeHeatingSystem {
    RiCReactive ric_reactive;
    /***    User implicit entries    ***/
    struct Furnace theFurnace;
    struct Room theRooms[3];
};

如果预先未知子对象的多重性,它会实施为链接列表。例如,如果您将 theRooms 的多重性指定为 *(而不是 3),它将实施为 RiCList,如下所示:

struct HomeHeatingSystem {
    RiCReactive ric_reactive;
    /***    User implicit entries    ***/
    struct Furnace theFurnace;
    RiCList theRooms;
};

您还可以使用其他类型的动态容器(例如集合)来实施子对象。您使用 CG::Relation::Implementation 属性来指定如何实施具体关系。例如,将 theRoomsImplementation 属性设置为 UnboundedUnordered 会将 theRooms 实施为 RiCCollection,而不是 RiCList 或数组。

主题 RiCContainers 下的属性确定如何为用于实施关系的不同类型的容器生成函数。请参阅“特征”窗口的相应属性选项卡上为属性提供的定义。


反馈