2012-12-23 126 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

這真的很酷,但並不完全符合我的要求,儘管我確信我可以通過一些修改來實現它。我會看一看! –