1

クラスがありAます。

クラスBとクラスCから派生したインターフェイスですA

      A
    /   \
   B     C

ここで、 との両方のクラスDとを実装する必要があります。EBC

そして、いくつかのクラスがあります: FDBGDCHECIEBJDBKDCLEB(これらのクラスの名前の最後MECにあるDBDCは、クラスが、 、for 、forなどの末尾にandDを使用することを意味します。BDBDCDCEBEB

それで:

class A..

class `B`: public virtual `A`..
class `C`: public virtual `A`..

class `D`: public B, public `C`..
class `E`: public B, public `C`..

class `FDB`: public `D`..
class `GDC`: public `D`..
class `HEC`: public `E`..
class `IEB`: public `E`..
class `JDB`: public `D`..
class `KDC`: public `D`..
class `LEB`: public `E`..
class `MEC`: public `E`..

しかし、私はダイヤモンドの継承を持っていて、それを望んでいません。

誰かが別のデザインを提案できますか?

どんな助けでも大歓迎です!

4

1 に答える 1

2

多重継承を回避したい/回避する必要がある理由は何ですか?

いずれにせよ、これらのケースのいくつかで継承を使用できない (したくない) 場合は、カプセル化を使用してください。

class A..

class `B`: public virtual `A`..
class `C`: public virtual `A`..

class `D`: public B {
private:
    C c_instance_;
};
class `E`: public B {
    C c_instance_;
};

... 

コードの重複を避けるために、C (または D) ホルダーを作成し、保護された継承と CRTP を介して継承できます。このように、別の基本クラスは C 基本機能を保持しますが、それを継承するクラスには共通の基本クラスがありません。

class A..

class B: public A..
class C: public A..

template<class Specialized, class DependedOn>
class DependsOn {
protected:
    DependedOn& get() { return implementation_; }
private:
    DependedOn implementation_;
};

class D: public B, protected DependsOn<D, C> .. // inheritance with CRTP
class E: public B, protected DependsOn<E, C> .. // inheritance with CRTP

class FDB: public D, protected DependsOn<FDB, B> .. 

DEなどはFDB、このget()メソッドを内部的に (具体的にDependsOn<D, C>::get()DependsOn<E, C>::get()などで) 使用して、パブリック インターフェイスを実装します。

DependsOn<D, C>は とは異なるためDependsOn<E, C>、階層全体で実装される共通のインターフェイスしかありません。

于 2013-05-08T11:19:03.870 に答える