在使用具有相等运算符定义的抽象类时,如何定义父类以减少代码重复?

时间:2017-08-02 14:05:03

标签: c++ design-patterns polymorphism abstract-class

我在下面以“简单”的方式举例说明了我想要做的事情。我有一个抽象类A,它使用两种方法向世界公开一个公共接口:operator==performTasksSpecificToA。您可以看到我正在使用“模板方法模式”以及“奇怪的重复模板模式”,以确保A的用户不必担心{{1}的实现},换句话说A,同时仍能检查两个AImpl实例的相等性。有关此方法的更多信息和背景信息,请参阅this answer on SO

现在,假设我希望按如下方式定义一个类AImpl

B

正如您所看到的,在定义用于比较子类的公共 class B { public: virtual ~B() = 0; bool operator(const B& b) const; void performTasksSpecificToB(); }; 方面,类BA具有相同的问题。如何定义父类,我们称之为operator==,以避免在LetterA之间复制代码?

这是我的'简单示例',它编译并运行。

B

1 个答案:

答案 0 :(得分:0)

如果您允许Letter成为模板,则只需从模板库继承A

template<class T>
class Letter
{   
public:
    bool operator==(const Letter<T>& t) const {
        const T& t1 = static_cast<const T&>(*this);
        const T& t2 = static_cast<const T&>(t);
        return t1.checkEquality_(t2);
    }
private:
    virtual bool checkEquality_(const T& a) const = 0;
};

class A : public Letter<A>
{
    public:
        virtual ~A() = 0;
        void performTasksSpecificToA();
};
...

如果您绝对需要通用的Letter,则可能需要添加另一层CRTP,就像使用A_A一样。