継承ツリーのリーフ間で情報を交換するという問題に直面していますが、特定のリーフは既存のすべてのリーフではなく、他の特定のリーフとのみ情報を交換する必要があります。次の (大幅に簡略化された) 継承ツリーと実装例をご覧ください。
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 を必要とする既存のステーションはごく少数であるため、肥大化した悪い設計に思えます。これをゼロから設計した場合、より良い方法があるかどうか、またはどのように処理するかは疑問です。
前もって感謝します。