解释起来有点棘手,但我会尽力解释。
我正在为游戏制作一个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。
有没有办法我可以重新设计这个,这样构造函数只需要设置它带来的主题部分,而不必设置它的父元素?
由于
答案 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()方法上你的班?也许我已经习惯了脚本语言,而不是通过严格打字来理解一些问题。