2

次の問題に出くわしました: A と B の 2 つのパッケージがそれぞれのパッケージで正常に動作しています。それぞれに独自のインターフェースと独自の実装があります。ここで、A のアダプターと B の具体的な実装を組み合わせたパッケージ C を作成しました。C は実際には A のインターフェイスのみを実装し、B のインターフェイスを内部的に継承して使用するだけです。ほとんどの場合、コンテナからインターフェイス A にアクセスするだけで十分でしたが、今では B からのメソッドにもアクセスできる必要があります。簡単な例を次に示します。

//----Package A----
class IA 
{virtual void foo() = 0;}; 
// I cant add simply bar() here, it would make totally no sense here...

class A : public IA
{virtual void foo() {doBasicWork();} };

//----Package B----
class IB
{virtual void bar() = 0;};

class B1 : public IB
{
    //Some special implementation
    virtual void bar() {} 
};

class B2 : public IB
{
    //Some special implementation
    virtual void bar() {} 
};
// + several additional B classes  , with each a different implementation of bar()

//---- Mixed Classes
class AB1 : public B1, public A
{
void foo() {A::foo(); B1::bar();}
};

class AB2 : public B2, public A
{
void foo() {A::foo(); B2::bar();}
};

// One Container to rule them all: 
std::vector<IA*> aVec;
AB1 obj1;
AB2 obj2;

int main(){
    iAvector.push_back(&obj1);
    iAvector.push_back(&obj2);
    for (std::vector<IA>::iterator it = aVec.begin(); it != aVec.end(); it++)
    {
        it->for(); // That one is okay, works fine so far, but i want also :
//      it->bar(); // This one is not accessible because the interface IA 
                           // doesnt know it.
    }
    return 0;
}

/* I thought about this solution: to inherit from IAB instead of A for the mixed 
   classes, but it doesnt compile, 
stating "the following virtual functions are pure within AB1: virtual void IB::bar()"
which is inherited through B1 though, and i cant figure out where to add the virtual
inheritence. Example:

class IAB : public A, public IB
{
//  virtual void foo () = 0; // I actually dont need them to be declared here again,
//  virtual void bar () = 0; // do i? 

};

class AB1 : public B1, public IAB
{
    void foo() {A::foo(); B1::bar();}
};
*/

問題は、パッケージ A と B の両方の組み合わせを実現して、1 つのコンテナから両方のインターフェイスにアクセスできるようにする一方で、A と B のすべての実装の詳細を継承するにはどうすればよいかということです。

4

1 に答える 1