1. ホーム
  2. typescript

[解決済み] ベースクラスのメンバへのアクセス

2022-06-08 23:23:18

質問

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

私は一行だけコードを変更しました。 Horse.move() . そこで、私は super.name にアクセスしたいのですが、それは単に undefined . IntelliSenseは使えることを示唆しているし、TypeScriptも問題なくコンパイルできるのですが、うまくいきません。

何かいい案はありませんか?

どのように解決するのですか?

動作例です。以下、注意事項。

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() を扱うのであれば、特殊な Snake または Horse 関数を使用するため super.move() を使うと明示的に基底クラスの関数を呼び出すことになります。

プロパティはインスタンスのプロパティであるため、混同することはありません。という違いはありません。 super.namethis.name - があるのは、単に this.name . そうしないと、特化クラスか基底クラスかによって異なる名前を持つHorseを作成することができます。