在这种情况下促进代码重用

时间:2010-12-08 22:05:22

标签: c++ oop

解释起来有点棘手,但我会尽力解释。

我正在为游戏制作一个Gui API,它有主题。

首先,我将解释Widgets的工作原理。

一个Button,例如,继承自Widget。 主题的工作方式相似。

ButtonTheme继承自WidgetTheme。

在每个widget类中,都有一个反应主题的实例。

Widget类有:

    private:
   static WidgetTheme widgetTheme;
    public:
   static WidgetTheme& getWidgetTheme();

按钮类有:

  private:
    static ButtonTheme buttonTheme;
    public:
   static ButtonTheme& getButtonTheme();

Widget构造函数,从其主题ex:

构建自己
Widget()
{
   setFont(getWidgetTheme().getFont());
}
继承自WidgetTheme的Button必须做同样的事情,因为内部窗口小部件不知道要从ButtonTheme构造,所以我的按钮最终必须这样做:

Button()
{
   setFont(getButtonTheme().getFont());
   setButtonPadding(getButtonTheme().getButtonPadding());
}

这就是我的问题所在。我必须重新提供所有WidgetTheme并将它们重定向到ButtonTheme的Widget参数,这确实是错误的。如果我不这样做,SuperButton将继承Button的样式,它也会继承Widget的样式,但我想要的是SuperButton使用它的ButtonTheme和WidgetTheme版本,因为SuperButtonTheme将继承ButtonTheme和WidgetTheme。

有没有办法我可以重新设计这个,这样构造函数只需要设置它带来的主题部分,而不必设置它的父元素?

由于

3 个答案:

答案 0 :(得分:2)

虚拟getTheme()(如同暗示的那样)但使用covariant return types应该解决您的问题而不需要强制转换。

答案 1 :(得分:1)

Widget构造函数可以接受WidgetTheme并使用它。

Widget(const WidgetTheme& theme)
{
   setFont(theme.getFont());
}

Button() : Widget(getButtonTheme())
{
   setButtonPadding(getButtonTheme().getButtonPadding());
}

答案 2 :(得分:0)

我不太清楚getButtonTheme()和getWidgetTheme()在你的对象层次结构中的位置,但似乎应该由类来决定它的主题是什么,为什么不在getTheme()方法上你的班?也许我已经习惯了脚本语言,而不是通过严格打字来理解一些问题。