每个子对象将 HomeHeatingSystem 作为其父对象,而 HomeHeatingSystem 可以根据名称访问它的每个子对象。HomeHeatingSystem 的这个视图称作对象结构视图,因为它显示了对象的内部结构。根据系统的性质,子对象之间可以互相链接,或者不链接。
在组合中,父对象保留子对象的值,而不是指针。父对象负责在子对象之后进行初始化和清除。请参阅初始化子对象以了解更多信息。
缺省情况下,子对象会指定单个实例并作为父对象结构的成员来实施。成员的名称和类型与子对象的名称和类型相同。换言之,子对象通过值嵌入在父对象中,而不是指向对象的指针。
当子对象的多重性指定为大于 1 的数字时,子对象会在缺省情况下实施为数组。例如,theFurnace 和 theRooms 实施为 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 属性来指定如何实施具体关系。例如,将 theRooms 的 Implementation 属性设置为 UnboundedUnordered 会将 theRooms 实施为 RiCCollection,而不是 RiCList 或数组。
主题 RiCContainers 下的属性确定如何为用于实施关系的不同类型的容器生成函数。请参阅“特征”窗口的相应属性选项卡上为属性提供的定义。