2012-10-29 6 views
58

活字サイト上の遊び場から継承例を参照してください:私は1行のコードに変更してい基底クラスの活字体へのアクセスメンバー

class Animal { 
    public name; 
    constructor(name) { 
     this.name = name; 
    } 
    move(meters) { 
     alert(this.name + " moved " + meters + "m."); 
    } 
} 

class Snake extends Animal { 
    constructor(name) { super(name); } 
    move() { 
     alert("Slithering..."); 
     super.move(5); 
    } 
} 

class Horse extends Animal { 
    constructor(name) { super(name); } 
    move() { 
     alert(super.name + " is Galloping..."); 
     super.move(45); 
    } 
} 

var sam = new Snake("Sammy the Python") 
var tom: Animal = new Horse("Tommy the Palomino") 

sam.move() 
tom.move(34) 

を:Horse.moveでアラートを()。そこには "super.name"にアクセスしたいが、それは単に未定義を返す。 Intellisenseは私がそれを使うことができ、TypeScriptがうまくコンパイルされることを示唆していますが、うまくいきません。 アイデア

答えて

97

実例。以下の注意。

class Animal { 
    constructor(public name) { 
    } 

    move(meters) { 
     alert(this.name + " moved " + meters + "m."); 
    } 
} 

class Snake extends Animal { 
    move() { 
     alert(this.name + " is Slithering..."); 
     super.move(5); 
    } 
} 

class Horse extends Animal { 
    move() { 
     alert(this.name + " is Galloping..."); 
     super.move(45); 
    } 
} 

var sam = new Snake("Sammy the Python"); 
var tom: Animal = new Horse("Tommy the Palomino"); 

sam.move(); 
tom.move(34); 
  1. 手動でパブリック変数に名前を割り当てる必要はありません。コンストラクタ定義でpublic nameを使用すると、これが実行されます。

  2. 特殊なクラスからsuper(name)に電話する必要はありません。

  3. this.nameを使用してください。

superの使用上の注意。

これについては、言語仕様の4.8.2節で詳しく説明しています。

Animalから継承しているクラスの動作は、他の言語の動作と似ていません。特別な関数と基本クラス関数の混乱を避けるために、superキーワードを指定する必要があります。たとえば、move()またはthis.move()を呼び出した場合は、特殊なSnakeまたはHorse関数を扱うため、super.move()を使用すると明示的に基本クラス関数が呼び出されます。

プロパティの混乱はありません。インスタンスのプロパティであるためです。 super.namethis.nameの間に違いはありません。単純にthis.nameです。それ以外の場合は、特殊クラスか基本クラスかによって、異なる名前のHorseを作成することができます。

+0

偉大な答え、言語仕様への参照に感謝します。たとえば、基本クラスのプロパティアクセサが仮想化されず、派生クラスのオーバーライドアクセサを介してアクセス可能である(メソッドなど)場合のドキュメントについて知っていますか? –

+0

セクション4.8には、これまでに書かれたものすべてが含まれています。「これが理由」ではなく、「これは行動です」という傾向があります。 – Fenton

+2

Steve Fentonに感謝します。私もここで似たような議論をしました:https://typescript.codeplex.com/discussions/418349。言語の不均衡と思われる。私の推測では、JavaScriptサポートの欠如を補うための "回避策"ヘルパーメソッドとは対照的に、発行されたJavaScriptを単純なままにすることが決定されました。 –

関連する問題