2015-12-10 4 views
1

Согласно http://www.thinkbottomup.com.au/site/blog/C%20%20_Mixins_-_Reuse_through_inheritance_is_goodMixin и интерфейс реализации

Но подвесить на минуту, ничего из этого не помогает нам подключить к нашей инфраструктуре диспетчера задач как классы не реализуют интерфейс ITask. Это где один окончательный Mixin помогает - в подмешать, который вводит интерфейс 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 прост - это просто другое звено в цепочке mixins.

// 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 не является абстрактным, это может привести к проблеме алмаза.

ответ

2

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

В последнем примере Mixin класс MyTask равен не, полученный от ITask. Это означает, что его нельзя отнести к указателю ITask, который выполняется в самом конце.

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

+0

ах, я пропустил, что 'MyTask' не был получен из' ITask'. Благодаря! – q126y