定义AS3类时,可以使用隐式getter和setter来调用函数以进行简单的属性获取/设置操作。例如,我可以像这样创建一个温度等级:
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;
这非常有用,但据我所知,它只适用于在类定义中声明的属性。但是,我发现能够在动态创建的属性上定义getter和setter非常有用。像这样:
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中动态创建属性getter和setter?
答案 0 :(得分:7)
就像练习一样,还有另一种方式,可以完成类似的东西 - 尽管不是直接等同 - 再加上一个“间接”。请考虑以下代码
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);
}
}
这个小类接受一个实例,一个属性的名称,然后是两个函数(一个getter和一个setter)。它只提供一个名为“value”的公共属性。公共getter和setter由传入的函数支持。
然后使用它们,你可以做类似的事情:
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
现在,我并不是说它是一个很好的方法,但它是我能在语言限制范围内最接近的。可以做出一些明显的改进,即将传入的getter和setter抽象为静态方法以便重用。可能受益的另一件事是,由于ActionScript不支持用户泛型,因此创建强类型value
的返回类型的特定类。
答案 1 :(得分:2)
您可以查看代理类(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Proxy.html)来实现此目的。当然,对于这样的吸气者和制定者来说,没有智能感知。此外,您需要扩展Proxy类,因此该类无法实现适合该设计的任何其他继承。
答案 2 :(得分:1)
不幸的是,这是不可能的。仅使用自定义旧式设置器和getter,如setFahrenheit(value:int)
和getFahrenheit():int