0

AS3クラスを定義する場合、暗黙のゲッターとセッターを使用して、単純なプロパティのget/set操作の関数を呼び出すことができます。たとえば、次のような温度クラスを作成できます。

public var celsius:Number;

public function get fahrenheit():Number {
    return 9/5 * celsius + 32;
}

public function set fahrenheit(fahrenheit:Number):void {
    celsius = 5/9 * (fahrenheit - 32);
}

次に、他のプロパティと同じように華氏で温度を取得/設定できます。

temperature.fahrenheit = 69.2;

これは本当に便利ですが、私が知る限り、クラス定義で宣言されたプロパティに対してのみ機能します。ただし、動的に作成されたプロパティでゲッターとセッターを定義できると非常に便利です。このようなもの:

var obj:Object = new Object();
obj._foo = "bar";
obj.foo = function get () { return this._foo; };
obj.foo = function set (foo:String) { this._foo = foo; };

残念ながら、そのような構文は存在しないので、私の質問はこれです:AS3でプロパティゲッターとセッターを動的に作成することは可能ですか?

4

3 に答える 3

7

演習と同じように、もう1つの「間接参照」を使用して、直接同等ではありませんが、同様のことを実行できる別の方法があります。次のコードを検討してください

class DynamicProperty {

    private var _getter:Function, _setter:Function;
    private var _source:*, _prop:String;

    public function DynamicProperty(source:*, prop:String, getter:Function, setter:Function):void {
        _getter = getter;
        _setter = setter;
        _source = source;
        _prop = prop;
    }

    public function get value():* {
        return _getter(_source[_prop]);
    }

    public function set value(val:*):void {
        _source[_prop] = _setter(val);
    }
}

この小さなクラスは、インスタンス、プロパティの名前、そして2つの関数(ゲッターとセッター)を取ります。「value」という名前のパブリックプロパティを1つだけ提供します。パブリックゲッターとセッターは、渡された関数によってサポートされています。

そして、それらを使用するには、次のようなことを行うことができます。

       var data:Object = {
           celsius: 0
       };

       data.kelvin = new DynamicProperty(data,"celsius", 
           function(v:Number):Number { return v + 273.15; }, 
           function(v:Number):Number { return v - 273.15; });

次にアクセスするkelvinには、次を使用します。

data.kelvin.value

data.kelvin.value = 0; // absolute zero

今、私はその素晴らしいアプローチを提案していませんが、それは言語の制約の中で私が考えることができる最も近いものです。渡されたゲッターとセッターを静的メソッドに抽象化して再利用するなど、明らかな改善がいくつかあります。ActionScriptはユーザージェネリックをサポートしていないため、の戻り型を強く型指定する特定のクラスを作成することで、もう1つのメリットが得られる可能性がありvalueます。

于 2012-12-23T17:12:33.260 に答える
2

これを実現するには、プロキシクラス(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Proxy.html)を参照してください。もちろん、そのようなゲッターやセッターにはインテリセンスはありません。また、Proxyクラスを拡張する必要があるため、このクラスでは、設計に適合する他の継承は不可能です。

于 2012-12-24T21:01:29.003 に答える
1

残念ながら、これは不可能です。カスタムのオールドスタイルのセッターとゲッターのみを使用しsetFahrenheit(value:int)getFahrenheit():int

于 2012-12-23T09:51:17.210 に答える