2011-09-09 12 views
4

パブリックゲッターと保護されたセッターでプロパティを持つことは可能ですか?ActionScriptのプロパティ - パブリックゲッター、プロテクトされたセッター

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;を持っていたが、私はコンパイルエラーについてのより詳しい情報を得るためにそれを分割:

は、私は、次のコードを持っています。

プロパティが同じクラス内で読み取り専用とみなされる方法はわかりません。私はまた、それがどのようにアクセス不能であるかを理解していません。

私がバッキングフィールド、ゲッター、セッターをすべてプロテクトにすると、コンパイルされますが、それは私が望む結果ではありません。私は外部から読めるように健康が必要です。

答えて

5

いいえ、アクセサには同じ特権レベルが必要です。あなたの公衆に のget関数を与えてから、setHealth、getHealth関数のペアを保護することができます。必要に応じて逆にすることもできますが、重要なポイントは、パブリック特権でアクセスするメソッドと保護された特権レベルでアクセスするメソッドのセットがあることです。

+0

+1、もう少し昨夜、グーグル・グーグルで、私は回避策なしで同様の答えを見つけました。一貫性のないAPIが好きではありませんが、言語の欠点に対処しなければならないと思います。 –

0

私は専門家だが、私はあなただけのMobクラス内から_healthを更新されますので、あなたが

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

これは、健康状態を設定しようとしたときにエラーが発生します。「バーチャルインストゥルメントの健康状態と健康状態との関係」Typem:ModifierTest. –

+0

英語では、上記のエラー1178と同じです。 –

3

を使用したい場合があり、あなたがそれを設定するためのプライベート関数を書くことができると思います。

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

パブリックゲッターをそのまま使用してください。

+0

+1ですが、同じ特権レベルである必要があることを指摘しているため、FlexFiendの回答を受け入れました。 –

関連する問題