0

継承ツリーのリーフ間で情報を交換するという問題に直面していますが、特定のリーフは既存のすべてのリーフではなく、他の特定のリーフとのみ情報を交換する必要があります。次の (大幅に簡略化された) 継承ツリーと実装例をご覧ください。

class station
{
virtual void transportOut(item* i, station *target) = 0;
virtual void transportIn(item* i, station *source) = 0;
};

class stationTransportOnly : public station
{
virtual void transportOut(item* i, station *target);
virtual void transportIn(item* i, station *source);
};

class stationTransportAndRotate : public station
{
virtual void transportOut(item* i, station *target);
virtual void transportIn(item* i, station *source);
};

との実装例は次のようにtransportOutなりtransportInます。

void transportOut(item *i, station *target)
{
 target->transportIn(i, this);
 SendTransportOutCommandToRealMachine(i. target);
}

void transportIn(item *i, station *source)
{
 SendTransportInCommandToRealMachine(i. source);
}

ステーションがトランスポートを処理する方法 (たとえば、実際のコンベア ベルトに送信されるコマンド、ステーションがモデル化するもの) はステーション固有です。これは何年もの間問題なく機能していましたが、現在では要件が変わりました。一部のステーションでは、以前よりも輸送を同期する必要があります。それらは、トランスポート コマンドに「タスク ID」を必要とします。これは、アウト トランスポート ステーションとイン トランスポート ステーションで同じでなければなりません。ID は で生成される可能性がありますtransportOutが、問題は ID を輸送ステーション内でどのように運ぶかです。

のインターフェースを単純に拡張するかもしれませんがtransportIn、この ID を必要とする既存のステーションはごく少数であるため、肥大化した悪い設計に思えます。これをゼロから設計した場合、より良い方法があるかどうか、またはどのように処理するかは疑問です。

前もって感謝します。

4

1 に答える 1

0

アイテムが id プロパティを持てないのはなぜですか? その後、TransportOut はその ID を設定でき、それは TransportIn メソッドによって読み取られます。

そのように:

void transportOut(item *i, station *target)
{
    i->SetID(generateID());
    target->transportIn(i, this);
    SendTransportOutCommandToRealMachine(i, target);
}

void transportIn(item *i, station *source)
{
    int taskID = i->GetID();
    SendTransportInCommandToRealMachine(i, source);
}
于 2012-05-27T01:10:03.160 に答える