Flash 在AS3中动态创建多个只读属性
我有一节课,目前相当混乱/重复:Flash 在AS3中动态创建多个只读属性,flash,actionscript-3,private,dynamically-generated,Flash,Actionscript 3,Private,Dynamically Generated,我有一节课,目前相当混乱/重复: public class AvFramework extends Object { // vars private var _handler:AvHandler; private var _keyboard:AvKeyboard; private var _manager:AvManager; /** * Constructor */ public function AvFramework()
public class AvFramework extends Object
{
// vars
private var _handler:AvHandler;
private var _keyboard:AvKeyboard;
private var _manager:AvManager;
/**
* Constructor
*/
public function AvFramework()
{
_handler = new AvHandler();
_keyboard = new AvKeyboard();
_manager = new AvManager();
// attach
_handler.framework = this;
_keyboard.framework = this;
_manager.framework = this;
}
/**
* Getters
*/
public function get keyboard():AvKeyboard{ return _keyboard; }
public function get manager():AvManager{ return _manager; }
}
这个类只需要使用越来越多的类,我真的不想像上面这样有3个巨大的列表
是否有一种方法可以动态执行上述操作?可能在字符串循环中使用getDefinitonByName()
来表示我要创建的类
我还希望属性是只读的,并且可以通过framework.myDynamicVarHere
访问
我的想法是这样的:
这个[“var”]=newblah()设置变量代码>
var required:Object =
{
keyboard: "avian.framework.background.AvKeyboard",
manager: "avian.framework.background.AvManager",
handler: "avian.framework.background.AvHandler"
};
var i:String;
for(i in required)
{
var Req:Class = Class(getDefinitionByName(required[i]));
this[i] = new Req();
AvFrameworkObject(this[i]).framework = this;
}
只是不确定如何将这些设置为只读。也许您可以尝试将长长的ClassW列表包装到object中:
var required:Object =
{
keyboard: "avian.framework.background.AvKeyboard",
manager: "avian.framework.background.AvManager",
handler: "avian.framework.background.AvHandler"
};
...
public class AvFramework extends Object {
private var holder: Object;
public function AvFramework() {
holder = new Object();
var i:String;
for(i in required)
{
var Req:Class = Class(getDefinitionByName(required[i]));
var name = //get Class name from required[i] e.g. AvKeyboard from avian.framework.background.AvKeyboard
holder[name] = new Req();
holder[name].framework = this;
}
}
public var getHolder() { return holder; }
}
例如,您可以通过framework.getHolder()[“AvKeyboard”]
或甚至通过framework.getHolder()[someVar]
引用AvKeyboard
。所以required
中的所有这些类都是只读的,因为holder
是只读的
希望这对你有帮助 您可以使用代理类来控制get/set调用并完成Eugeny89应答。 看或
在这段代码中,当您执行myavframeworkbj.something时,getProperty()是自动调用的,您可以从“name”变量中获取属性名。您应该拥有私有变量holder:Object={};(并且不要在构造函数中初始化它为新对象)如果您想遵循Adobe Styleic标准;for(i in必填)不是必需的。使用
for(vari:String-in-required)
只初始化字符串一次,并且在for循环之后字符串仍然存在。这条额外的线路给你的唯一好处是。。。还有一行。@cwallenpole是真的,这对我来说更合适@Eugeny89谢谢:)回答得不错-我也有同样的想法,但是通过framework.getHolder()[“things”]通过framework访问一切(从框架对象)。things非常令人不快:(
var required:Object =
{
keyboard: "avian.framework.background.AvKeyboard",
manager: "avian.framework.background.AvManager",
handler: "avian.framework.background.AvHandler"
};
...
import flash.utils.Proxy;
import flash.utils.flash_proxy;
public dynamic class AvFramework extends Proxy {
private var holder: Object = {};
public function AvFramework() {
var i:String;
for(i in required)
{
var Req:Class = Class(getDefinitionByName(required[i]));
var name = //get Class name from required[i] e.g. AvKeyboard from avian.framework.background.AvKeyboard
holder[name] = new Req();
holder[name].framework = this;
}
}
flash_proxy override function getProperty( name: * ): *
{
return holder[name];
}
flash_proxy function setProperty(name:*, value:*):void
{
// Do nothing
}
}