1

次のようなインターフェイス(抽象基本クラスとして定義)があります。

class AbstractInterface
{
public:
    virtual bool IsRelatedTo(const AbstractInterface& other) const = 0;
}

そして、私はこれを実装しています(コンストラクターなどは省略されています):

class ConcreteThing
{
public:
    virtual bool IsRelatedTo(const AbstractInterface& other) const
    {
        return m_ImplObject.has_relationship_to(other.m_ImplObject);
    }

private:
    ImplementationObject m_ImplObject;
}

AbstractInterface はプロジェクト A のインターフェイスを形成し、ConcreteThing はそのインターフェイスの実装としてプロジェクト B に存在します。これは、プロジェクト A のコードが、プロジェクト B に直接依存することなく、プロジェクト B のデータにアクセスできるようにするためです。プロジェクト B は、正しいインターフェイスを実装するだけで済みます。

明らかに、IsRelatedTo 関数の本体の行はコンパイルできません。ConcreteThing のインスタンスには m_ImplObject メンバーがありますが、other引数を含め、すべての AbstractInterfaces がコンパイルできるとは想定できません。

私のシステムでは、実際には、AbstractInterface のすべての実装が ConcreteThing (またはそのサブクラス) のインスタンスであると想定できますが、プライベート メンバーを取得するためにオブジェクトを具象型にキャストしたり、それをエンコードしたりしたくありません。この仮定が成り立たなくなった場合、後で診断なしでクラッシュします。

ImplementationObject は変更できませんが、AbstractInterface と ConcreteThing は変更できます。また、キャスト前に型をチェックするために標準の RTTI メカニズムを使用したり、同様の目的で dynamic_cast を使用したりすることもできません。

ConcreteThing 引数でオーバーロードできるような気がしますがIsRelatedTo、ベースの IsRelatedTo(AbstractInterface) メソッドを介して呼び出す方法がわかりません。そのメソッドの厳密な再実装ではないため、自動的に呼び出されることはありません。

私がここでやりたいことをするためのパターンはありIsRelatedToますImplementationObject::has_relationship_to(ImplementationObject)か?

(また、良い質問のタイトルが思いつきませんでした。より良い質問のタイトルがあれば変更してください。)

4

0 に答える 0