4

私は Delphi と C# のバックグラウンドを持っているので、インターフェイスを彼らの視点から理解しています。私は数年間 C++ をやっていますが、その観点からインターフェイスをまだ学んでいます。

私のアプリケーションでは、各クラスでサポートされているさまざまな動作を示すために、複数のインターフェイスを実装する (つまり、複数の純粋な抽象クラスを継承する) クラスが必要な状況があります。これは正確には ISP ではありませんが、同じ問題であるほど十分に近いものです。

動作インターフェイスは相互に継承されません。階層はありません。

Delphi と C# は息を切らさずにこれを行いますが、C++ でこれがどのように行われるかを理解しようとしています。(また、今のところ、私は C++11 に限定されています。)

dynamic_pointer_cast、static_pointer_cast について調査しましたが、継承階層が必要です。

reinterpret_pointer_cast を見ましたが、C++11 では使用できません。

ビヘイビアー インターフェイスが継承するルート インターフェイス (COM の IUnknown や Delphi の IInterface に似ています) を使用して継承階層を作成しようとしましたが、ひし形の問題に遭遇しました。

基本インターフェースにメソッドを追加して各ビヘイビアーインターフェースへの参照を返すという提案をいくつか見てきましたが、それは私が本当に望んでいない一種の結合です。後でそれらを実装する他のビヘイビアーやクラスを追加する必要があるかもしれないからです。

これは、私がやろうとしていることの簡単な例を示す、コンパイルしていないコードです。

class IBase
{
public:
    virtual void DoBaseStuff() = 0;
}

class IBehaviorA
{
public:
    virtual void DoBehaviorA() = 0;
}

class IBehaviorB
{
public:
    virtual void DoBehaviorB() = 0;
}

class Base : public IBase
{
public:
    Base()  {}
    virtual ~Base() {}
    virtual void DoBaseStuff() { /* ... */ }
}

class JustA : public IBase, public IBehaviorA
{
public:
    JustA() {}
    virtual ~JustA() {}
    virtual void DoBaseStuff() { /* ... */ }
    virtual void DoBehaviorA() { /* ... */ }
}

class JustB : public IBase, public IBehaviorB
{
public:
    JustB() {}
    virtual ~JustB() {}
    virtual void DoBaseStuff() { /* ... */ }
    virtual void DoBehaviorB() { /* ... */ }
}

class AandB : public IBase, public IBehaviorA, public IBehaviorB
{
public:
    AandB() {}
    virtual ~AandB() {}
    virtual void DoBaseStuff() { /* ... */ }
    virtual void DoBehaviorA() { /* ... */ }
    virtual void DoBehaviorB() { /* ... */ }
}

void ProcessAllBehaviorA(std::vector<std::shared_ptr<IBase>> bases)
{
    for (auto& base : bases)
    {
        std::shared_ptr<IBehaviorA> behaviorA
                    = SOME_KIND_OF_CAST<IBehaviorA>(base);

        if (behaviorA != nullptr)
        {
            behaviorA->DoBehaviorA();
        }
    }
}

void main()
{
    std::vector<std::shared_ptr<IBase>> bases;

    bases.push_back(std::shared_ptr<IBase>(new Base()));
    bases.push_back(std::shared_ptr<IBase>(new JustA()));
    bases.push_back(std::shared_ptr<IBase>(new JustB()));
    bases.push_back(std::shared_ptr<IBase>(new AandB()));

    ProcessAllBehaviorA(bases);
}

SOME_KIND_OF_CAST プレースホルダーが ProcessAllBehaviorA メソッドのどこにあるのかを理解しようとしています。

私はこれをやろうとする最初の人にはなれないと確信しています。

他の人は、C++ でスマート ポインターを使用してインターフェイス分離の原則 (または私のような同様のパターン) をどのように実装していますか?

4

1 に答える 1