полиморфизм — шаблон адаптера в C ++ с не виртуальными адаптированными методами

Я хочу создать класс адаптера в C ++, но интерфейс, к которому я хочу адаптироваться, имеет несколько не виртуальных методов. Могу ли я использовать обычный шаблон адаптера?

    #include <iostream>
using namespace std;

class  NewInterface{
public:
int methodA(){ cout << "A\n"; }
virtual int methodB(){ cout << "B\n"; }
};

class OldInterface{
public:
int methodC(){ cout << "C\n"; }
int methodD(){ cout << "D\n"; }
};

class Old2NewAdapter: public NewInterface {
public:
Old2NewAdapter( OldInterface* a ){ adaptee = a; }
int methodA(){ return adaptee->methodC(); }
int methodB(){ return adaptee->methodD(); }
private:
OldInterface* adaptee;
};

int main( int argc, char** argv )
{
NewInterface* NI = new Old2NewAdapter( new OldInterface() );
NI->methodA();
NI->methodB();
return 0;
}

Если у меня есть эта настройка, вывод будет «A D» вместо «C D», как и должно быть.

Итак, как я могу адаптировать OldInterface к NewInterface, не переписывая NewInterface, чтобы все методы были виртуальными?

0

Решение

Можете ли вы представить другой класс? Если вы можете, вы можете заменить функции, которые используют NewInterface с четным NewerInterface:

class NewerInterface
{
public:
int methodA()
{
// preconditions
int const result = doMethodA();
// postconditions
return result;
}

int methodB()
{
// preconditions
int const result = doMethodB();
// postconditions
return result;
}

private:
virtual int doMethodA() = 0;
virtual int doMethodB() = 0;
};

class Old2NewerInterface : public NewerInterface
{
public:
explicit Old2NewerInterface(OldInterface& x) : old_(&x)

private:
virtual int doMethodA() { return old_->methodC(); }
virtual int doMethodB() { return old_->methodD(); }

private:
OldInterface* old_;
};

class New2NewerInterface : public NewerInterface
{
public:
explicit New2NewerInterface(NewInterface& x) : new_(&x)

private:
virtual int doMethodA() { return new_->methodA(); }
virtual int doMethodB() { return new_->methodB(); }

private:
NewInterface* new_;
};
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector