flash – 在AS3中动态创建多个只读属性
发布时间:2020-12-15 07:25:48 所属栏目:百科 来源:网络整理
导读:我有一堂课,现在很乱/重复: public class AvFramework extends Object{ // vars private var _handler:AvHandler; private var _keyboard:AvKeyboard; private var _manager:AvManager; /** * Constructor */ public function AvFramework() { _handler = n
我有一堂课,现在很乱/重复:
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 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; } 只是不确定我怎样才能使这些只读. 解决方法
您可以使用Proxy类来控制get / set调用并完成Eugeny89的答案.
看看 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Proxy.html或 http://blog.joa-ebert.com/2007/05/25/as3-proxy-example/ var required:Object = { keyboard: "avian.framework.background.AvKeyboard",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 } } 使用此代码,当您执行myAvFrameworkObj.something时,getProperty()将自动调用,并从“name”变量获取属性名称. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |