下図に示すように、サンプルのオブジェクト・モデル図は、theFurnace と theRooms の間の対称関連を示します。 この関連は to-many リンクで、この場合は 1 つの暖房が 3 つの部屋にサービスを提供します。

ロールは、次のように実装されます。
デフォルトで、リンクには、単一インスタンスがあります。 単一インスタンスへのリンクは、スカラーと呼ばれます。スカラー関係は、その名前がロールと同じで、そのタイプが他のオブジェクトへのポインターであるオブジェクトの構造内のデータ・メンバーに生成されます。 例えば、Furnace を指すポインターのタイプの itsFurnace メンバーが、Room 構造のメンバーとして生成されて、 Room の Furnace に対するリンクを表します。
struct Room {
/*** User implicit entries ***/
struct Furnace * itsFurnace;
};
リンク・アクセサーは、関連オブジェクトへのポインターを返します。 その名前のフォーマットは、<object>_get_<rolename>() です。
例えば、次のアクセサーは、itsFurnace のロール用に生成されます。
struct Furnace * Room_get_itsFurnace(const Room*
const me);
これは、リンク・アクセサーの実装です。
struct Furnace * Room_get_itsFurnace(
const Room* const me)
{
return (struct Furnace * )me->itsFurnace;
}
リンク・ミューテーターは、関連オブジェクトへのポインターを設定します。 リンクが対称的である場合、ミューテーターもまた相互リンクを設定します。
リンク・ミューテーターには、最高 3 つまでのメソッドが生成されます。
例えば、次のミューテーターは itsFurnace のロール用に生成されます。
void Room_setItsFurnace(Room* const me, struct Furnace
*p_Furnace);
これは、リンク・ミューテーターの実装です。 Furnace と Room の間のリンクは対称的であるため、ミューテーターもまた相互リンクを設定します。
void Room_setItsFurnace(Room* const me, struct Furnace
*p_Furnace) {
if(p_Furnace != NULL)
Furnace__addItsRoom(p_Furnace, me);
Room__setItsFurnace(me, p_Furnace);
}
リンクが対称関係である場合、最初のミューテーターが 2 番目のミューテーターを呼び出します。2 番目のミューテーターの名前には、「set」という語の前に 2 文字のアンダースコアーが付きます。
void Room__setItsFurnace(Room* const me, struct Furnace
*p_Furnace) {
if(me->itsFurnace != NULL)
Furnace__removeItsRoom(me->itsFurnace, me);
Room___setItsFurnace(me, p_Furnace);
}
リンクが対称関係である場合、2 番目のミューテーターが 3 番目のミューテーターを呼び出します。3 番目のミューテーターの名前には、「set」という語の前に 3 文字のアンダースコアーが付きます。
void Room___setItsFurnace(Room* const me,
struct Furnace * p_Furnace) {
me->itsFurnace = p_Furnace;
if(p_Furnace != NULL) {
NOTIFY_RELATION_ITEM_ADDED(me, Room, Furnace,
"itsFurnace", p_Furnace, FALSE, TRUE);
}
else
{
NOTIFY_RELATION_CLEARED(me, Room,"itsFurnace");
}
}
これら 3 つの操作が一体となって、Furnace と Room の間の対称リンクを設定します。