5

現時点では非常に面倒/反復的なクラスがあります:

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

これらを読み取り専用にする方法がわかりません。

4

2 に答える 2

4

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-を参照してください。プロキシの例/

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" 変数からプロパティ名が取得されます。

于 2011-06-03T11:06:28.080 に答える
1

おそらく、classws の長いリストをオブジェクトにラップしようとするでしょう:

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読み取り専用です。

それがあなたを助けることを願っています!

于 2011-06-03T09:51:47.523 に答える