Согласно 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
не является абстрактным, это может привести к проблеме алмаза.
ах, я пропустил, что 'MyTask' не был получен из' ITask'. Благодаря! – q126y