这有点棘手,但我会尽力解释。
我正在为游戏制作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应该可以解决您的问题而无需强制转换。