To-many 링크의 유형은 다음과 같습니다.
구현하기 위해 사용되는 컨테이너에 따라, 링크의 각 유형에 적절한 액세서 및 뮤테이터 오퍼레이션이 생성됩니다. 관계 구현의 기본값은 역할 특성을 통해 수정할 수 있습니다.
기본적으로 두 개 이상의 오브젝트에 대한 순서 지정된 링크는 RiCList로 구현됩니다. CG::Relation::Ordered 특성을 선택으로 설정하여 to-many 링크의 순서가 지정됩니다. 이 순서 지정에는 다중성이 알려진 관계(경계가 있고 순서 지정된 관계)와 다중성이 알려지지 않은 관계(경계가 없고 순서 지정된 관계)가 포함됩니다.
기본적으로 두 개 이상의 오브젝트에 대한 순서 지정되지 않은 링크는 RiCCollection으로 구현됩니다. To-many 링크는 Ordered 특성을 선택 취소로 설정하여 순서 지정이 취소됩니다. 이 링크에는 다중성이 알려진 관계(경계가 있고 순서 지정되지 않은 관계)와 다중성이 알려지지 않은 관계(경계가 없고 순서 지정되지 않은 관계)가 포함됩니다.
서브오브젝트에 대한 링크는 서브오브젝트의 다중성이 1(임베디드 스칼라 관계)인 경우 임베디드 데이터 멤버로, 또는 서브오브젝트의 다중성이 1보다 큰 숫자 값(임베디드 고정 관계)인 경우 배열로 구현됩니다.
예를 들어, HomeHeatingSystem 오브젝트에는 itsFurnace라고 하는 하나의 서브오브젝트와 itsRoom이라고 하는 세 개의 서브오브젝트(모두 컴포넌트로 임베드됨)가 있습니다. 이러한 경우 theFurnace에는 임베디드 스칼라 관계가 있고 theRooms에는 HomeHeatingSystem에 대한 임베디드 고정 관계가 있습니다. 이러한 관계는 다음과 같이 구현됩니다.
struct HomeHeatingSystem {
/*** User implicit entries ***/
struct Furnace theFurnace;
struct Room theRooms[3];
};
스칼라 관계의 경우 CG::Relation::Implementation 특성을 Scalar로, 또는 고정 관계의 경우 Fixed로 설정하여 동일한 효과를 볼 수 있습니다. 이러한 유형의 관계 구현은 두 가지 조건에서만 사용됩니다.
기본적으로 고정 다중성의 to-many 링크는 RiCCollection으로 구현됩니다.
기본적으로 규정자가 링크에 지정된 to-many 링크는 RiCMap으로 구현됩니다.
랜덤 액세스 링크는 컨테이너의 항목에 대한 랜덤 액세스를 제공하도록 향상된 관계입니다. 역할에 대한 C_CG::Relation::GetAt 특성을 선택으로 설정하여 to-many 링크에 랜덤 액세스를 제공할 수 있습니다. C_CG::Relation::GetAtGenerate 특성 역시 선택으로 설정해야 합니다. 이 설정은 컨테이너에 적절한 getAt() 메소드를 사용하는 역할에 대해 액세서를 생성합니다. $index 키워드는 컨테이너 내의 특정 요소에 액세스하기 위해 getAt() 메소드에 매개변수로 전달됩니다. $index의 기본값은 int i입니다.
예를 들어, 경계가 없고 순서 지정된 관계의 GetAt 특성은 다음 값을 보유합니다.
RiCList_getAt(&$me$cname, $index)
theRooms에 대한 GetAt 특성을 선택으로 설정하면 특정 Room에 액세스할 수 있도록 다음 액세서가 HomeHeatingSystem에 생성됩니다.
struct Room * HomeHeatingSystem_getTheRooms(
const HomeHeatingSystem* const me, int i) {
return RiCList_getAt(&me->theRooms, i);
}