コンポジション

オブジェクト・ベースのシステムで複雑な処理を行う基本的手段は、オブジェクトの分解による方法です。 1 つのオブジェクトは、他の複数のオブジェクトあるいはサブオブジェクト (ネスト・オブジェクト)で構成されることがあります。サブオブジェクトは、親オブジェクト内に定義されたオブジェクトです。 親オブジェクト (または所有者) は、要求をそのサブオブジェクトによって処理されるように委譲することができ、サブオブジェクトは、親オブジェクトに連絡を戻すことができます。

各サブオブジェクトは、HomeHeatingSystem が親であると認識し、 HomeHeatingSystem は、各サブオブジェクトに名前でアクセスできます。 この HomeHeatingSystem のビューは、オブジェクトの内部構造を示すため、オブジェクト構造ビューと呼ばれます。 サブオブジェクトは、システムの特性によって、互いにリンクすることも、あるいはリンクしないことも可能です。

コンポジションを使用して、親オブジェクトはポインターではなく値によってサブオブジェクトを保持します。 親オブジェクトは、サブオブジェクトの初期化と後のクリーンアップを行う責任があります。 詳細については、サブオブジェクトの初期設定を参照してください。

デフォルトで、サブオブジェクトは単一インスタンスを指定し、親オブジェクトの構造の 1 メンバーとして実装されます。 メンバーの名前とタイプは、サブオブジェクトの名前とタイプと同じです。 別の言い方をすれば、サブオブジェクトは、親オブジェクトに対するポインターとしてではなく、値によって親オブジェクトに組み込まれています。

サブオブジェクトの多重度が 1 より大きい数に指定されている場合、サブオブジェクトはデフォルトで配列として実装されます。 例えば、theFurnacetheRooms は、HomeHeatingSystem 構造のメンバーとして実装されています。 オブジェクト theFurnace は、タイプ Furnace の単一インスタンスとして実装され、 theRooms は、3 つの 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 は、RiCList あるいは配列としてではなく RiCCollection として実装されます。

サブジェクト RiCContainers の下のプロパティーにより、関係の実装に使用される多種多様なコンテナー用に関数を生成する方法が決まります。 「フィーチャー」ウィンドウの該当する「プロパティー」タブにあるプロパティーの定義を参照してください。


フィードバック