如何组合模板方法模式和多重继承?

时间:2012-06-08 21:12:39

标签: c++ inheritance design-patterns template-method-pattern

我可以更改此代码以使其正常工作吗?是否可以组合模板方法模式和多重继承?在不同的类中实现不同的算法似乎非常方便。谢谢。

class TBase {
public:
    virtual void Do1() const = 0;
    virtual void Do2() const = 0;

    void Do() const {
        Do1();
        Do2();
    }
};

class TFirstAlgorithm {
public:
    void Do1() const {}
};

class TSecondAlgorithm {
public:
    void Do2() const {}
};

class TAlgorithm
    : public TBase
    , public TFirstAlgorithm
    , public TSecondAlgorithm
{};

2 个答案:

答案 0 :(得分:3)

从根本上说,问题在于TFirstAlgorith::Do1TBase::Do1(以及TSecondAlgorithm::Do2TBase::Do2无关。

解决这个问题的一种可能方法是使它们相关:

class TBase {
public:
    virtual void Do1() const = 0;
    virtual void Do2() const = 0;

    void Do() const {
        Do1();
        Do2();
    }
};

class TFirstAlgorithm : public virtual TBase {
public:
    void Do1() const { }
};

class TSecondAlgorithm : public virtual TBase {
public:
    void Do2() const { }
};

class TAlgorithm
    : public TFirstAlgorithm
    , public TSecondAlgorithm
{};

答案 1 :(得分:0)

您可以使用Do1和Do2的实现,并在其中调用适当的算法。

 class TBase {
    public:
        virtual void Do1() const = 0;
        virtual void Do2() const = 0;

    void Do() const {
        Do1();
        Do2();
    }
};

class TFirstAlgorithm {
public:
    void Do1() const {}
};

class TSecondAlgorithm {
public:
    void Do2() const {}
};

class TAlgorithm
    : public TBase
    , public TFirstAlgorithm
    , public TSecondAlgorithm
{
   virtual void Do1() const { TFirstAlgorithm::Do1() ; }
   virtual void Do2() const { TSecondAlgorithm::Do2() ; }  
};