我使用MoSync/MAUI創建一個移動應用原型,但是我面臨與類 繼承了一個問題:訪問C++矢量元素而不鑄造
爲標準窗口小部件MAUI的類層次是:
Widget
EditBox
Label
ListBox
...
然後,因爲我想一個標準的行爲添加到所有的部件,我做了一個單獨的 類來定義這種行爲:
class xFocusControl:
public:
void method1() {};
void method2() {};
int member1;
....
和繼承每個插件類型:
然後,在好幾個地方我需要訪問使用MoSync的getChildren()函數, 定義爲所有的部件:
const Vector<Widget*>& MAUI::Widget::getChildren()
我的問題是:給定這個層次結構,我可以迭代所有的孩子,但不能訪問新行爲(例如:widget-> member1)而不投射。但是,我怎麼能一般地將每個小部件投到其類? ?到目前爲止,我有一些代碼測試每個可能的widget類像
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。據我所知,鑄造沒有辦法。會有虛擬功能等,但不幫助你的問題。鑄造是理想的方式。您可以編寫自己的getWidget函數,並將所有witdgets存儲在某個類的某個位置。據我所知,多重繼承不好也許你可以避免這種情況。 – Gabriel 2012-07-28 23:22:04
@Gabriel:但是我怎麼能避免多重繼承?我無法修改基類(Widget),因爲它在MoSync :: MAUI庫中定義。有沒有辦法在沒有子類的情況下在原始類中注入新代碼? – PabloG 2012-07-29 13:36:02