2016-08-08 29 views
1

Ich habe den folgenden Code in meinem Typescript. Aber es meldet den folgenden Fehler in der child._moveDeltaX(delta) Linie:Eigenschaft 'foo' ist geschützt und nur durch eine Instanz der Klasse 'Foo' (in Instanzen von Foo) zugänglich

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

Der Code der Folowing ist:

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); 
     }); 
    } 
} 

Was habe ich falsch gemacht? Ich dachte, dass du auf eine geschützte Methode zugreifen kannst. In anderen Lenguajes würde dieser Code problemlos funktionieren.

Antwort

1

Das Objekt "childs" befindet sich nicht in der Sichtbarkeit des geerbten Objekts. Sie haben gerade eine neue Instanz erstellt, die nicht auf die geschützte Methode zugreifen kann. Sie können auf die geschützten Methoden mit super, aber nicht für andere Instanzen zugreifen.

Dies würde auch in C# fehlschlagen (denke ich).

+0

Es gibt keine Abhilfe, oder? Würden Sie mich bitten, stattdessen einen öffentlichen Setter zu erstellen? – Ciberman

+1

Gut. Sie können einfach auf 'any' umwandeln: '( child) ._ moveXDelta (delta);'. Aber du verlierst die Kompilierzeit (Typoskript), um nach dieser einen Zeile zu suchen (nicht wirklich eine schreckliche Sache, wenn du kein Typoskript-Purist bist). – Vaccano

+0

Großartig! Das habe ich nicht getan. Ich werde das machen. (Ich habe deine Antwort als richtig akzeptiert, danke!) – Ciberman