我有下一个课程: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可能没有这种逻辑。不幸的是,装饰器和递归模板在这里不合适。
答案 0 :(得分:0)
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
继承的通用逻辑的类的一种方法。然后ObjectWidget
和TextWidget
都从此类继承,而不是直接从WidgetBase
继承。
如果您不希望ObjectWidget
和TextWidget
除了WidgetBase
外有一个共同的祖先,那么可以使用CRTP模式。为此,您可以使用通用逻辑创建模板类。然后ObjectWidget
和TextWidget
继承自WidgetBase
和该模板类(模板参数为派生类)。
或者,模板类可以从WidgetBase
继承,然后ObjectWidget
和TextWidget
仅需要从模板类继承。
答案 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
}