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

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

首先,我将解释小部件的工作方式。

例如,一个Button继承自Widget。
主题的工作原理类似。

ButtonTheme继承自WidgetTheme。

在每个小部件类内部,都有一个与其对应的主题的实例。

窗口小部件类具有:

    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并将它们重定向到Widget的ButtonTheme的参数,这确实让我感到不对。如果我不这样做,SuperButton将继承Button的样式,而SuperButtonTheme也会继承Widget的样式,但是我想要的是SuperButton使用它的ButtonTheme和WidgetTheme版本,因为SuperButtonTheme将继承自ButtonTheme和WidgetTheme。

有没有一种方法可以重新设计,以便构造函数只需要设置它带来的主题的一部分,而不必设置其父主题的一部分?

谢谢

最佳答案

一个虚拟的getTheme()(如建议的那样),但是使用covariant return types应该可以解决您的问题而无需强制转换。

08-19 18:57