1. ホーム
  2. typescript

[解決済み] TypeScriptで純粋な抽象クラスを拡張する場合と実装する場合

2023-03-29 06:19:23

質問

純粋な抽象クラス(つまり、実装のない抽象クラス)があるとします。

abstract class A {
    abstract m(): void;
}

C#やJavaのように を拡張します。 という抽象的なクラスがあります。

class B extends A {
    m(): void { }
}

しかし とは異なり では、C#やJavaでも インプリメント を実装することができます。

class C implements A {
    m(): void { }
}

クラスはどのように BC は異なる動作をするのでしょうか?なぜどちらかを選択しなければならないのでしょうか?

(現在、TypeScriptの ハンドブック 言語仕様 は抽象クラスは対象外です)。

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

この が実装している キーワードは A クラスをインターフェースとして扱い、つまり C は A で定義された全てのメソッドを実装しなければなりません。 に実装されているかどうかに関わらず、C は A で定義された全てのメソッドを実装しなければならないことを意味します。 A . また、スーパーメソッドの呼び出しは C .

が伸びる は、このキーワードから期待されるものに近い振る舞いをします。抽象的なメソッドのみを実装すればよく、スーパーコールは利用可能/生成されます。

抽象的なメソッドの場合、違いはないのでしょう。しかし、めったにないことですが クラス を持つことは稀であり、もしあれば、それを インターフェース .

生成されたコードを見ればすぐにわかると思います。プレイグラウンドの例を作ってみました ここで .