我正在使用MoSync/MAUI创建移动应用程序原型,但我遇到了该类的问题继承:
标准MAUI小部件的类层次结构是:
Widget
EditBox
Label
ListBox
...
然后,因为我想为所有的小部件添加一个标准行为,我制作了一个单独的类来定义该行为:
class xFocusControl:
public:
void method1() {};
void method2() {};
int member1;
....
并对每个小部件类型进行子类划分:
class xEditBox: public xFocusCtrl, public EditBox
{
public:
...
}
class xLabel: public xFocusCtrl, public Label
{
public:
...
}
...
然后,在一些地方,我需要使用MoSync getChildren()函数访问所有的小部件,定义为:
const Vector<Widget*>& MAUI::Widget::getChildren()
我的问题是:给定这个层次结构,我可以迭代所有的子对象,但不能访问没有强制转换的新行为(例如:widget->member1)。但是,我如何将每个小部件通用地转换为它的阶级?到目前为止,我正在用之类的代码测试每个可能的小部件类
member1 = 0;
if (isType <xLabel*> (widget)) {
member1 = ((xLabel*) (widget))->member1;
}
if (isType <xEditBox*> (widget)) {
member1 = ((xEditBox*) (widget))->member1;
}
...
但这对我来说很糟糕:我是一个C++新手,而且更精通Python等动态语言,所以我可能采取了错误的方法。
你介意有更好的方法吗?
如评论中所述,我使用常规强制转换而不是dynamic_cast,因为到目前为止MoSync不支持dynamic_cast
您应该使用dynamic_cast
xLabel* label = dynamic_cast<xLabel*>(widget);
if (label)
{
member1 = label->member1;
}
// dynamic cast failed
else
{
}