如何共享两个类的特定逻辑?

时间:2019-10-07 14:16:28

标签: c++ architecture

我有下一个课程:WidgetBase,TextWidget,ObjectWidget,OtherWidget。 TextWidget,OtherWidget和ObjectWidget继承了WidgetBase。 ObjectWidget具有一些逻辑,TextWidget也应具有。

class WidgetBase
{
    // some base logic
}

class ObjectWidget : public WidgetBase
{
    // some logic specific for ObjectWidget and TextWidget
}

class TextWidget : public WidgetBase
{
    // some logic specific for ObjectWidget and TextWidget
}

class OtherWidget : public WidgetBase
{
    // this class should not have logic that is specific for ObjectWidget and TextWidget
}

我如何共享特定于ObjectWidget和TextWidget的逻辑? 但是,TextWidget可能没有这种逻辑。不幸的是,装饰器和递归模板在这里不合适。

3 个答案:

答案 0 :(得分:0)

简单继承应该为您提供帮助-为ObjWidget和TextWidget引入一个通用的util基础(假设中间需要具有Basewidget道具)。澄清一下,如果这不适合#

class WidgetBase
{
    // some base logic
}

class ObjTextCommonLogic 
{
    public:
    // Implement common logic method here
}
class ObjectWidget : public WidgetBase, protected ObjTextCommonLogic
{
    // some logic specific for ObjectWidget and TextWidget
}

class TextWidget : public WidgetBase, protected ObjTextCommonLogic
{
    // some logic specific for ObjectWidget and TextWidget
}

class OtherWidget : public WidgetBase
{
    // this class should not have logic that is specific for ObjectWidget and TextWidget

}

答案 1 :(得分:0)

创建具有从WidgetBase继承的通用逻辑的类的一种方法。然后ObjectWidgetTextWidget都从此类继承,而不是直接从WidgetBase继承。

如果您不希望ObjectWidgetTextWidget除了WidgetBase外有一个共同的祖先,那么可以使用CRTP模式。为此,您可以使用通用逻辑创建模板类。然后ObjectWidgetTextWidget继承自WidgetBase和该模板类(模板参数为派生类)。

或者,模板类可以从WidgetBase继承,然后ObjectWidgetTextWidget仅需要从模板类继承。

答案 2 :(得分:0)

不确定查询中的“逻辑”是什么意思,但是您可以使用Bridge Design Pattern作为这样的解决方案:

struct impl {
    //implementations here
    void foo() { /* … */ }
    void bar() { /* … */ }
};

class ObjectWidget : public WidgetBase
{
    // some logic specific for ObjectWidget and TextWidget
    public: void foo() { impl_->foo(); }    
    private: struct impl* impl_;
};

class TextWidget : public WidgetBase
{
    // some logic specific for ObjectWidget and TextWidget
    public: void bar() { impl_->bar(); }
    private: struct impl* impl_;
};

class OtherWidget : public WidgetBase
{
    // no access to struct impl    
}