0

継承に関して次の問題があります(グーグルで検索したいのですが、正しいキーワードがわかりません)。

function とのインターフェイスを実装するModuleクラスがあります。クラスを継承し、インターフェイスを継承する関数でインターフェイスを実装するクラスもあります。ここで、あいまいさと二重継承の問題が発生し始めています。IModuleA()ClientModuleModuleIClientModuleB()IModule

問題についてもう少し詳しく説明するクラス図を次に示します。

ここに画像の説明を入力

インターフェイスとインターフェイスへのアクセスを提供するインターフェイスを使用して、Moduleクラスへのアクセスを分離する必要があります。IModuleClientModuleIClientModuleIModule

4

2 に答える 2

1

IClientModule が IModule を継承しないようにします (おそらく名前を IClient に変更します)。ClientModule では、Module から継承して IClient を実装するだけです。

または、コメントを読んだ後に書かれた代替ソリューション:

例のように、ClientModule クラスを IClientModule から継承させます。ただし、Module から継承する代わりに、単に ClientModule に Module であるメンバー変数を指定し、必要に応じてこのメンバーへの呼び出しを転送します。このようなもの:

class IModule { virtual void A() {} };
class Module : public IModule { ... };
class IClientModule : public IModule { virtual void B() {} };

class ClientModule : public IClientModule 
{
    // ...
    virtual void A() { _module.A(); }

private:
    Module _module;
};

ただし、これらを一緒にマッシュするのは避けて、私のオリジナルのソリューションを使用する方がよいでしょう。

于 2013-05-21T11:13:29.887 に答える