【发布时间】:2014-05-29 13:42:40
【问题描述】:
我目前的项目是在 as3 中,但这也是我对其他语言感到好奇的地方。
我正在尝试使用工厂对象来动态创建适当的对象。我的LevelFactory 有一个静态方法,它返回提供给该方法的级别编号的新实例。在调用该方法的代码中,我可以动态创建按钮来调用级别,如下所示:
for (var i:int = 1; i < 4; i++) {
var tempbutton:Sprite = createButton("Level " + i, 25, 25 +(60 * i), start(i));
_buttons.push(button);
}
这段代码只是用给定的参数(ButtonText, x, y, function) 创建了一个简单的按钮。它工作正常。按钮已创建,单击其中一个按钮将调用此方法并使用适当的参数
private function start(level:int):Function {
return function(e:MouseEvent):void {
disableButtons();
newLevel = LevelFactory.createLevel(level);
addChild(newLevel);
}
}
一切正常;我只是为背景上下文提供它。我的问题是:是否可以动态选择我的静态函数返回的对象类型?目前,我正在这样做
public static function createLevel(level:int):Level {
var result:Level;
switch(level) {
case 1: result = new Level1(); break;
case 2: result = new Level2(); break;
//etc
}
return result;
}
我应该注意,所有这些 Level1、Level2 等类都扩展了我的基本级别类。 (耶多态性!)我想做的是能够按照以下方式做一些事情
public static function createLevel(level:int):Level {
var result:Level;
var levelType:String = "Level" + level;
return new levelType();
}
显然它不适用于这样的字符串,但是有没有办法在 as3 中实现这一点?那么其他语言呢,例如 Java 或 Python?可以动态选择要实例化什么类型的子类吗?
更新:
import Levels.*;
import flash.events.*;
import flash.utils.*;
public class LevelFactory
{
public static function createLevel(level:int):Level {
var ref:Class = getDefinitionByName('Levels.' + 'Level' + level) as Class;
var result:Level = new ref();
return result;
}
}
更新/编辑:getDefinitionByName 似乎是我正在寻找的,但它有问题。似乎编译器会剥离未使用的导入,这意味着除非我提前在代码中声明每个子类,否则此方法会得到引用错误。如何避免需要分别声明每个类(这违背了动态实例化的目的)?
【问题讨论】:
标签: actionscript-3 polymorphism