在AS3中动态创建多个只读属性

Mar*_*rty 5 flash private actionscript-3 dynamically-generated

我有一堂课,现在很乱/重复:

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; }
}
Run Code Online (Sandbox Code Playgroud)

这个类是只将需要利用越来越多的班,我真的不希望有3只巨大的列出了本像上面.

有没有办法动态地执行上述操作 - 可能getDefinitonByName()在字符串循环中使用来表示我想要创建的类.

我还希望属性是只读的并通过访问framework.myDynamicVarHere.

我正在考虑以下几点:

  1. 我创建了一个我想要创建实例的类的列表,并与应该访问的变量名配对.
  2. 我需要上课,dynamic以便我可以设置变量this["var"] = new Blah();

我想到的快速片段:

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;
}
Run Code Online (Sandbox Code Playgroud)

只是不确定我怎样才能使这些只读.

Sim*_*aud 4

您可以使用Proxy类来控制get/set调用并完成Eugeny89应答。请参阅http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Proxy.htmlhttp://blog.joa-ebert.com/2007/05/25/as3-代理示例/

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
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,当您执行 myAvFrameworkObj.something 时,会自动调用 getProperty() 并从“name”变量中获取属性名称。