2011-09-09 34 views
4

是否有可能擁有公共getter和受保護的setter屬性?動作腳本屬性 - Public Getter,受保護的安裝程序

我有以下代碼:

public class Mob extends Sprite { 
    // snip 

    private var _health:Number; // tried making this protected, didn't work 
    public function get health():Number { return _health; } 
    protected function set health(value:Number):void { 
     _health = value; 
    } 

    // snip 

    public function takeDamage(amount:Number, type:DamageType, ... additionalAmountAndTypePairs):void { 
     var dmg:Number = 0; 
     // snip 
     var h:Number = this.health; // 1178: Attempted access of inaccessible property health through a reference with static type components.mobs:Mob. 
     this.health = h - dmg; // 1059: Property is read-only. 
    } 
} 

我確實有this.health -= dmg;,但我把它分解出來讓編譯器錯誤的詳細信息。

我不明白該屬性如何在同一個類中被認爲是隻讀的。我也不明白它是如何無法訪問的。

如果我使支持字段,getter和setter都受保護,它會編譯,但它不是我想要的結果;我需要健康從外部可讀。

回答

5

不,訪問者必須具有相同的權限級別。你可以讓你的公衆 獲得設置功能,然後有一個受保護的setHealth,getHealth函數對。如果您願意,您可以將其撤消,但關鍵是您有一套方法可以在公共權限下訪問,另一種方式可以在受保護的特權級別訪問。

+0

+1,經過昨晚Google搜索後,我偶然發現了一個類似的答案,沒有解決方法。我不喜歡不一致的API,但我想我必須應付這種語言的缺點。 –

0

我不是專家,但我想你可能需要使用

internal var _health:Number; 
public function get health():Number { return _health; } 
internal function set health(value:Number):void { _health = value; } 
+0

這會導致嘗試設置健康時的錯誤:'Versuchter Aufruf einer nichtverfügbarenEigenschaft健康尤伯杯einen Verweis MIT statischem典型值TMP:ModifierTest.' –

+0

在英語中,它是一樣的錯誤,從1178上方。 –

3

因爲要更新從_healthMob類中唯一的,你可以寫一個私有函數來設置它。

private function setHealth(value:Number):void 
{ 
    _health = value; 
} 

並保持公共getter本身。

+0

+1,但接受了FlexFiend的回答,因爲他指出他們需要具有相同的權限級別。 –