Динамическое создание нескольких свойств только для чтения в AS3 - PullRequest
5 голосов
/ 03 июня 2011

У меня есть класс, который на данный момент довольно беспорядочный / повторяющийся:

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

Просто не уверен, как я смогу сделать их доступными только для чтения.

Ответы [ 2 ]

4 голосов
/ 03 июня 2011

Вы можете использовать класс Proxy для управления получением / установлением вызова и завершением ответа 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",
    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".

1 голос
/ 03 июня 2011

Может быть, вы попытаетесь обернуть этот длинный список классов в объекте:

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 только для чтения.

Надеюсь, это поможет вам!

...