2012-12-23 88 views
0

定义一个AS3类时,可以使用隐式获取器和设置器来调用简单属性获取/设置操作的函数。例如,我可以创建一个温度类,像这样:AS3中动态属性的隐式获取器和设置器?

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方法?

回答

2

不幸的是,这是不可能的。只有使用自定义的旧式getter和setter方法类似setFahrenheit(value:int)getFahrenheit():int

+0

除非您通过封闭装饰字段提供私人范围,否则它并没有什么意义。 –

6

只是作为一个运动,还有另一种方式一个可以完成类似的东西 - 虽然不能直接等同 - 多一个“间接”。请看下面的代码

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)。它只提供一个名为“价值”的公共财产。公共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 

现在,我不建议其伟大approac小时,但这是我能够在语言的限制范围内想到的最接近的。可以做出一些明显的改进,即将获取器和设置器中的传入抽象为静态方法以供重用。另一件可能受益的事情是,由于ActionScript不支持用户泛型,因此创建强类型为value的返回类型的特定类。

1

你可以看看代理类(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Proxy.html)来实现这一点。当然,对于这样的获得者和制定者来说,没有智能感知。另外,你需要扩展Proxy类,所以任何适合设计的其他继承对于这个类都是不可能的。

+0

这真的很酷,但并不完全符合我的要求,尽管我确信我可以通过一些修改来实现它。我会看一看! –