0

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のように動的言語に非常に精通しているため、間違ったアプローチを取っている可能性があります。

これを行うためのより良い方法を気にしますか?

コメントに記載されているように、MoSyncはこれまでdynamic_castをサポートしていないため、dynamic_castの代わりに通常のキャストを使用しています

4

1 に答える 1

1

使用する必要がありますdynamic_cast

xLabel* label = dynamic_cast<xLabel*>(widget);
if (label)
{
    member1 = label->member1;
}
// dynamic cast failed
else
{
}
于 2012-07-28T23:10:27.017 に答える