Mixin和接口实现

时间:2015-12-10 03:37:23

标签: c++ inheritance interface mixins

根据http://www.thinkbottomup.com.au/site/blog/C%20%20_Mixins_-_Reuse_through_inheritance_is_good

  

但是等一下,这一切都没有帮助我们插入我们的任务   管理器框架作为类不实现ITask接口。   这是一个最终的Mixin帮助的地方 - 一个引入的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不是抽象的,也可能导致钻石问题。

1 个答案:

答案 0 :(得分:4)

这是一篇非常酷炫有趣的文章。

在最后的Mixin示例中,MyTask类来自ITask 。这意味着它不能被强制转换为最终完成的ITask指针。

在该示例中,我相信您可以从MyTask派生ITask。但我认为作者希望说明您甚至可以使用MyTask来解除TaskAdapter课程。