2016-08-08 4 views
1

私はTypescriptに次のコードを書いています。しかし、それは報告しchild._moveDeltaX(delta)ラインに次のエラー:プロパティ 'foo'は保護されており、クラス 'Foo'(Fooのインスタンス)のインスタンスを通じてのみアクセス可能です

ERROR: Property '_moveDeltaX' is protected and only accesible 
     through an instance of class 'Container' 
INFO: (method) Drawable._moveDeltaX(delta:number):void 

コードがfolowingさ:

class Drawable { 

    private _x:number = 0; 

    constructor() {} 

    /** 
    * Moves the instance a delta X number of pixels 
    */ 
    protected _moveDeltaX(delta:number):void { 
     this._x += delta; 
    } 
} 

class Container extends Drawable { 
    // List of childrens of the Container object 
    private childs:Array<Drawable> = []; 

    constructor(){ super();} 

    protected _moveDeltaX(delta:number):void { 
     super._moveDeltaX(delta); 
     this.childs.forEach(child => { 
      // ERROR: Property '_moveDeltaX' is protected and only accesible 
      //  through an instance of class 'Container' 
      // INFO: (method) Drawable._moveDeltaX(delta:number):void 
      child._moveDeltaX(delta); 
     }); 
    } 
} 

は私が間違って何を持っていますか?保護されたメソッドにアクセスできると思っていました。他の言語では、このコードは問題なく動作します。

答えて

1

"子"オブジェクトは、継承されたオブジェクトの可視性にありません。保護されたメソッドにアクセスできない新しいインスタンスを作成しました。 superを使用して保護されたメソッドにアクセスできますが、他のインスタンスにはアクセスできません。

これはC#でも失敗する(私は思う)。

+0

回避策はありませんか?あなたは公共のセッターを作る代わりに私に甘い? – Ciberman

+1

。 'any': '(子)._ moveXDelta(delta);'にキャストできます。しかし、あなたはコンパイル時間(typescript)をチェックしてその1行をチェックします(もしあなたがタイスクリプトの純粋主義者でないなら、ひどいことではありません)。 – Vaccano

+0

素晴らしい!私はそれをしなかった。私はします。 (私はあなたの答えを正解と認めました、ありがとう!) – Ciberman

関連する問題