我正在使用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-&gt; 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
答案 0 :(得分:1)
您应该使用dynamic_cast
xLabel* label = dynamic_cast<xLabel*>(widget);
if (label)
{
member1 = label->member1;
}
// dynamic cast failed
else
{
}