Смешанная и интерфейсная реализация

В соответствии с http://www.thinkbottomup.com.au/site/blog/C%20%20_Mixins_-_Reuse_through_inheritance_is_good

Но подождите, ничто из этого не поможет нам подключиться к нашей Задаче
Фреймворк менеджера как классы не реализует интерфейс ITask.
Вот где помогает один последний миксин — миксин, который представляет
Интерфейс ITask в иерархию наследования, выступая в качестве адаптера
между некоторым типом T и интерфейсом ITask:

template< class T >
class TaskAdapter : public ITask, public T
{
public:
virtual void Execute()
{
T::Execute();
}

virtual std::string GetName()
{
return T::GetName();
}
};

Использовать TaskAdapter просто — это просто еще одна ссылка в цепочке
миксинов.

// typedef for our final class, inlcuding the TaskAdapter<> mixin
typedef public TaskAdapter<
LoggingTask<
TimingTask<
MyTask > > > task;

// instance of our task - note that we are not forced into any heap allocations!
task t;

// implicit conversion to ITask* thanks to the TaskAdapter<>
ITask* it = &t;
it->Execute();

Почему TaskAdapter необходимо, когда ITask реализуется MyTask? Также если ITask не является абстрактным, это может привести к проблеме алмазов.

3

Решение

Это очень классная и интересная статья.

В последнем примере Mixin, MyTask класс не происходит от ITask, Что означает, что это не может быть приведено к ITask указатель, который делается в самом конце.

В этом примере, я полагаю, вы могли бы получить MyTask от ITask, Но я думаю, что автор хотел проиллюстрировать, что вы можете даже отделить MyTask класс с помощью TaskAdapter,

4

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

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

По вопросам рекламы [email protected]