【发布时间】:2009-09-19 14:52:21
【问题描述】:
我目前正在设计一个列表小部件以添加到我的小部件引擎中。由于每个元素的视觉方面都是在代码之外定义的,因此我可以重用大部分代码库。例如选项卡按钮实际上是复选框。新模板需要时间来实现,因为它们至少应该在设计应用程序中有一个查看器。
我已经有一个复选框的实现。它有 2 个状态(选中/未选中)和 5 个子状态:正常、悬停/活动、鼠标按下、禁用和状态转换。复选框模板具有文本属性、图标(可选)和边框(可以调整大小)。还有状态和子状态转换。图标和边框都是动画的。
我关心的是列表项。它们与复选框非常相似。因此,我打算为列表项使用复选框模板。但是,我需要列表项的四种模式:简单(仅文本)、带图标、带复选框和带单选按钮(单选按钮源自复选框和 IRadioButton 接口)。这里是它的结构:
IWidgetObject
|
Checkbox IRadioButton
\ /
`--------------´
|
RadioButton
我希望实现这样的东西。 ListItemBase 应该从 IWidgetObject 派生。这是合乎逻辑的还是有更好的选择。
class ListItemBase : public Checkbox {
void Select() { do something; Checkbox::check(); }
}
//This listitem type will have a checkbox without any text
class ListItemCheckbox : public ListItemBase, private Checkbox {
check() { update parents checked list; Checkbox::check(); }
}
class ListItemRadio : public ListItemBase, private RadioButton, public IRadioButton {
//here is the problem
}
ListItemRadio 将有 2 个不同的复选框功能,我还想隐藏 ListItemBase 的 check() 函数(重命名它)。那我应该这样实现吗?
class ListItemBase : private Checkbox, public IWidgetObject {
void Select() { do something; Checkbox::check(); }
//does this even works? (layer is a variable)
using Checkbox::layer;
}
//This listitem type will have a checkbox without any text
class ListItemCheckbox : public ListItemBase, private Checkbox {
check() { update parents checked list; Checkbox::check(); }
}
class ListItemRadio : public ListItemBase, private RadioButton, public IRadioButton {
//here is the problem
}
但是这次我在 ListItemRadio 中有 2 个 IWidgetObjects,我应该克服实现常用功能。但是 ListItemBase 必须将 IWidgetObject 的所有内容都映射到 Checkbox。
是否可以使用虚拟继承来解决这些问题,例如委托给姊妹类(复选框)。还有一个问题,虽然 IWidgetObject 看起来像一个接口,但多年来它拾取了一些常见的实现,但我认为这不会是一个问题。
还有一个问题。 Checkbox 类具有非平凡的构造函数。是否可以这样写:
ListItemBase(IWidgetContainer &container, CheckboxBP &blueprint) :
Checkbox(container, blueprint), IWidgetObject(this) {
}
这会解决很多问题。欢迎任何想法。
感谢您阅读所有这些内容
【问题讨论】:
标签: c++ oop inheritance widget