2013-04-21 99 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

相关问题