2016-08-08 5 views
1

У меня есть следующий код на моем машинописном машинописном документе. Но он сообщает следующее сообщение об ошибке в 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 

Код на следующие:

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

Что у меня не так? Я думал, что вы можете получить доступ к защищенному методу. В других lenguajes этот код работал бы без проблем.

ответ

1

Объект «childs» не находится в видимости унаследованного объекта. Вы только что создали новый экземпляр, который не может получить доступ к защищенному методу. Вы можете получить доступ к защищенным методам с помощью супер, но не для других экземпляров.

Это не сработает в C#, также (я думаю).

+0

Нет обходного пути? Вы сами стараетесь создать публичный сеттер? – Ciberman

+1

Ну. вы можете просто нажать «any»: '( ребенок) ._ moveXDelta (delta);'. Но вы теряете время компиляции (машинопись), проверяя эту строку (не очень страшная вещь, если вы не являетесь стикерами-пуристами). – Vaccano

+0

Отлично! Я этого не сделал. Я сделаю это. (Я принял ваш ответ как правильно, спасибо!) – Ciberman