2013-04-21 63 views
0

可以說我有一個類cMenu,它有一個函數displayMenu()。該函數調用一個子類中的靜態函數的init(),這取決於傳遞給displayMenu(),像這樣:As3:傳遞類作爲參數,並調用靜態方法

cMenu.displayMenu('cMenuMain'); 

public class cMenu 
{ 
    public static function displayMenu(sMenu:String):void{ 

     switch(sMenu) { 
      case 'cMenuMain': 
       cMenuMain.init(); 
       break; 
      case 'cMenuHighscore': 
       cMenuHighscore.init(); 
       break; 
     } 

    } 
} 

public class cMenuMain 
{ 
    public static function init():void{ 
     trace('cMenuMain'); 
    } 
} 

我的問題:我可以以某種方式避免了開關,並調用子菜單的函數init()動態地根據sMenu設置爲什麼? 類似於eval(sMenu+'.init()');

感謝提示!

回答

1

如果你的子菜單類始終貫徹的init方法(你可以用一個接口來保證),你可以通過有針對性的子菜單的等級參數提供給displayMenu方法

public static function displayMenu(submenuClass:*):void{ 
// if you need to perform something here depending on the submenu class 
if (submenuClass is cMenuMain) { 
    // do something 
} 
submenuClass.init() 
} 

displayMenu(cMenuMain); 
+0

Thx這就是我正在尋找的! – Ilyssis 2013-04-21 11:37:48

+0

這並不意味着你將不得不爲所有不同的類都有一個大的if/else語句嗎? – 2013-04-21 21:24:05

1

爲了得到一個名稱字符串類,你可以使用getDefinitionByName,如下面的例子:

var ClassReference:Class = getDefinitionByName(sMenu) as Class; 

但隨後你就會知道到底是什麼類型的ClassReference是,所以不知道如果它甚至有一種init方法。

如果你是知道你可能只是調用靜態方法類型:

ClassReference.init(); 
+0

當我打電話'ClassReference.init();'我得到**的ReferenceError錯誤:錯誤#1065:變量cMenuMain沒有定義**。但是cMenuMain.init();作品,所以cMenuMain必須在那裏。 – Ilyssis 2013-04-21 10:10:53

相關問題