В соответствии с 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
не является абстрактным, это может привести к проблеме алмазов.
Это очень классная и интересная статья.
В последнем примере Mixin, MyTask
класс не происходит от ITask
, Что означает, что это не может быть приведено к ITask
указатель, который делается в самом конце.
В этом примере, я полагаю, вы могли бы получить MyTask
от ITask
, Но я думаю, что автор хотел проиллюстрировать, что вы можете даже отделить MyTask
класс с помощью TaskAdapter
,
Других решений пока нет …