컴포지션

오브젝트 기본 시스템에서 복잡도를 처리하기 위한 기본적인 수단은 오브젝트 분해를 이용하는 것입니다. 오브젝트는 다른 오브젝트나 서브오브젝트(중첩 오브젝트)로 구성될 수 있습니다. 서브오브젝트는 상위 오브젝트 내에서 정의된 오브젝트입니다. 상위 오브젝트(또는 소유자)는 해당 서브오브젝트가 처리할 요청을 위임할 수 있으며 서브오브젝트는 다시 해당되는 상위 오브젝트와 통신할 수 있습니다.

각 서브오브젝트는 HomeHeatingSystem을 해당되는 상위 오브젝트로 인식하며, HomeHeatingSystem은 이름으로 각각의 서브오브젝트에 액세스할 수 있습니다. 이 HomeHeatingSystem 보기를 오브젝트 구조 보기라고 합니다. 오브젝트의 내부 구조를 표시하기 때문입니다. 서브오브젝트는 시스템의 네이처에 따라 서로 링크하거나 링크하지 못할 수 있습니다.

컴포지션에서 상위 오브젝트는 포인터가 아닌 값으로 서브오브젝트를 보유합니다. 상위 오브젝트는 서브오브젝트를 초기화하고 정리해야 합니다. 자세한 정보는 서브오브젝트 초기화의 내용을 참조하십시오.

기본적으로 서브오브젝트는 단일 인스턴스를 지정하며 상위 오브젝트 구조의 멤버로 구현됩니다. 멤버의 이름 및 유형은 서브오브젝트 이름 및 유형과 동일합니다. 즉, 서브오브젝트는 상위 오브젝트에서 값으로 임베드됩니다(오브젝트에 대한 포인터가 아니라).

서브오브젝트의 다중성이 1보다 큰 숫자로 지정되는 경우 서브오브젝트는 기본적으로 배열로 구현됩니다. 예를 들어, theFurnacetheRoomsHomeHeatingSystem 구조의 멤버로 구현됩니다. 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로 설정하면 theRoomsRiCList 또는 배열이 아닌 RiCCollection으로 구현됩니다.

RiCContainers 주제 아래의 특성은 관계를 구현하기 위해 사용되는 다양한 컨테이너 유형에 대해 함수가 생성되는 방법을 결정합니다. 기능 창의 적용 가능한 특성 탭에 있는 특성에 대해 제공되는 정의를 참조하십시오.


피드백