【问题标题】:Creating multiple read-only properties dynamically in AS3在 AS3 中动态创建多个只读属性
【发布时间】:2011-06-03 03:36:00
【问题描述】:

我有一门课,目前相当混乱/重复:

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 访问。

我的想法是这样的:

  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;
}

只是不确定如何将这些设置为只读。

【问题讨论】:

  • 这个:var i:String;for(i in required) 不是必需的。使用for(var i:String in required),您只需初始化一次字符串,并且字符串在 for 循环之后仍然存在。附加线唯一能带给您的就是……附加线。
  • @cwallenpoole 没错,这对我来说读起来更好。 @Eugeny89 谢谢:)

标签: flash actionscript-3 private dynamically-generated


【解决方案1】:

您可以使用 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-proxy-example/

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
    }
}

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

【讨论】:

  • 你应该有私有变量持有者:Object = {}; (而不是在构造函数中将其初始化为新对象)如果您想遵循 Adob​​e 风格标准。
【解决方案2】:

也许您会尝试将一长串类包装在对象中:

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; }
}

您可以参考例如AvKeyboard framework.getHolder()["AvKeyboard"] 甚至 framework.getHolder()[someVar]。所以required 中的所有这些类都是只读的,因为holder 是只读的。

希望对你有帮助!

【讨论】:

  • 不错的答案 - 我有同样的想法,但是通过 framework.getHolder()["things"] over framework.things 访问所有内容(从框架对象)非常令人反感:(跨度>
猜你喜欢
  • 2011-04-04
  • 2010-11-24
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2021-05-27
相关资源
最近更新 更多