1. ホーム
  2. oop

[解決済み] typescript で基底クラスのコンストラクタでオーバーライドされたメソッドを呼び出す

2023-04-13 21:46:41

質問

ベースクラスのコンストラクタからオーバーライドされたメソッドを呼び出す際に、サブクラスのプロパティの値を正しく取得できません。

例を挙げます。

class A
{
    constructor()
    {
        this.MyvirtualMethod();
    }

    protected MyvirtualMethod(): void
    {

    }
}

class B extends A
{
    private testString: string = "Test String";

    public MyvirtualMethod(): void
    {
        alert(this.testString); // This becomes undefined
    }
}

typescriptで正しく関数をオーバーライドする方法を知りたいです。

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

実行の順番は

  1. A のコンストラクタ
  2. B のコンストラクタです。

代入は B のコンストラクタの A のコンストラクタ _super -が呼び出されました。

function B() {
    _super.apply(this, arguments);   // MyvirtualMethod called in here
    this.testString = "Test String"; // testString assigned here
}

ということで、以下のようになります。

var b = new B();     // undefined
b.MyvirtualMethod(); // "Test String"

これに対応するために、コードを変更する必要があります。例えば this.MyvirtualMethod() の中で B のコンストラクタに渡すか、ファクトリーメソッドを作成してオブジェクトを作成し、関数を実行するか、または文字列を A のコンストラクタに文字列を渡し、それを何らかの方法で処理する......いろいろな可能性があります。