2016-08-02 14 views
2

Playgroundはなぜゲッターで、スーパークラスのプロパティを取得することはできません[typescriptです]サブクラスだけだけセッターを定義した場合

class A 
{ 
    protected _value:number; 
    get value() 
    { 
     return this._value; 
    } 
} 

class B extends A 
{ 
    set value(v:number) 
    { 
     this._value = v; 
    } 
} 

var b = new B(); 
b.value = 2; 
console.log(b.value);//undefined 
が値を取得することはできません。

B.prototypeにObject.defineProperty "value"が設定されていると、A.prototypeの "value"ゲッター設定をオーバーライドしていると思います。

答えて

3

this accessors' restriction in this threadについては長い議論があります。

class A 
{ 
    protected _value:number; 

    get value():number 
    { 
     return this._value; 
    } 

    set value(v:number) 
    { 
     this._value = v; 
    } 
} 

class B extends A 
{ 

} 

またはあるいはサブクラスの両方を無効にする:予想される動作のスーパークラスにゲッターとセッターの両方を残すのいずれかの場合

class A 
{ 
    protected _value:number; 
    get value():number 
    { 
     return this._value; 
    } 

    set value(v:number) 
    { 
     this._value = v; 
    } 
} 

class B extends A 
{ 

    get value():number 
    { 
     return this._value; 
    } 

    set value(v:number) 
    { 
     this._value = v; 
    } 

} 

あなたがアクセサを使用しない場合代わりに通常の方法を使用すると、バーハビールは期待通りです。

class A 
{ 
    protected _value:number; 
    getvalue():number 
    { 
     return this._value; 
    } 

} 

class B extends A 
{ 

    setvalue(v:number) 
    { 
     this._value = v; 
    } 

} 

const b:B = new B(); 
b.setvalue(2); 
console.log(b.getvalue()); 
+0

お返事ありがとうございます。他の言語では、サブクラスが何らかの関数を持たない場合、スーパークラス関数が呼び出されます。 typescript not.iはこれをちょうど混乱させます。 – Sxd

関連する問題