139

TypeScript サイトのプレイグラウンドからの継承の例を参照してください。

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

コードの 1 行を変更しました: のアラートですHorse.move()。そこにアクセスしたいのですsuper.nameが、それはundefined. IntelliSense は、私がそれを使用できることを示唆しており、TypeScript は正常にコンパイルされますが、機能しません。

何か案は?

4

2 に答える 2

209

作業例。以下のメモ。

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.9.2で詳しく説明されています。

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

インスタンスのプロパティであるため、プロパティの混乱はありません。super.nameと の間に違いはありませんthis.name- ただありますthis.name。そうしないと、特殊なクラスにいるか基本クラスにいるかによって、異なる名前の Horse を作成できます。

于 2012-10-29T14:37:56.327 に答える