1. ホーム
  2. typescript

[解決済み] TypeScriptの「extends」と「implements」の違いとは?

2022-04-20 02:04:32

質問

を知りたいのですが。 男性 そして の共通点と相違点です。

class Person {
  name: string;
  age: number;
}
class Child extends Person {}
class Man implements Person {}

解決方法は?

ショートバージョン

  • extends を意味します。

その 新しいクラスは . これは継承によってもたらされる利益を得ることができます。すべてのプロパティとメソッドを親と同じように持つことができます。これらのいくつかをオーバーライドして新しいものを実装することができますが、親のものはすでに含まれています。

  • implements を意味します。

その 新しいクラス として扱うことができます。 "shape"。 一方 子ではありません . このメソッドは Person と異なる親を持つかどうかに関係なく Person

もっと見る ...

OOP (C#、Javaなどの言語) を使用します。

extends 相続で利益を得るために(参照 ウィキ ). 小出しにする。

... クラスベースのオブジェクト指向言語における継承は、あるオブジェクトが親オブジェクトのすべてのプロパティと振る舞いを取得するメカニズムである。継承によってプログラマは、既存のクラスの上にさらにクラスを作成することができるようになります ...

implements はポリモーフィズムのために多くなります ( ウィキ ). 小出しにする。

ポリモーフィズムとは、異なるタイプのエンティティに単一のインターフェイスを提供することです。

ということで、私たちの class Man .

class Man extends Human ...

が、別のタイプのふりをすることも宣言しておくと -。 Person :

class Man extends Human 
          implements Person ...

...そうすれば、どこでも使えるようになります。 Person が必要です。私たちはただPersonsの "interface" (すなわち、そのパブリックなものをすべて実装する) .

implement 他のクラス?それは本当にクールなものです

ジャバスクリプトの素敵な顔 (メリットの1つ) は、ダックタイピングのビルトインサポート( wikiを見る ). 小出しにします。

アヒルのように歩き、アヒルのように鳴くのであれば、それはアヒルに違いない。

つまり、Javascriptでは、2つの異なるオブジェクトが、1つの似たようなメソッドを持っている場合 (例) render() ) を期待する関数に渡すことができます。

function(engine){
  engine.render() // any type implementing render() can be passed
}

これを失わないために、Typescript では、より型付けされたサポートを用いて、同じことを行うことができます。そしてそれが

class implements class

にはその役割があり、それは意味のあるものです。

として、OOP言語では C# ... 方法がない...。

また、ここではドキュメントが役立つはずです。

<ブロッククオート

クラスを拡張するインターフェイス

インターフェース型がクラス型を拡張する場合、そのクラス型のメンバを継承します。 クラスの実装は含まれません。これは、あたかもインターフェイスが クラスのすべてのメンバを宣言しているのに、そのメンバを提供せずに 実装が必要です。インターフェイスはプライベートとプロテクトも継承します。 のメンバは、ベースクラスのメンバと同じです。つまり、インターフェイスを作成する場合 クラスを拡張し、プライベートまたはプロテクトされたメンバを持つインターフェイスは の型は、そのクラスかそのサブクラスでしか実装できません。

これは、大きな継承階層がありながら、その中で を持つサブクラスのみで動作するように指定することができます。 プロパティがあります。を継承していること以外には、サブクラスは関係する必要がありません。 ベースクラスから 例えば

class Control {
    private state: any;
}

interface SelectableControl extends Control {
    select(): void;
}

class Button extends Control implements SelectableControl {
    select() { }
}

class TextBox extends Control {
    select() { }
}

// Error: Property 'state' is missing in type 'Image'.
class Image implements SelectableControl {
    private state: any;
    select() { }
}

class Location {

}

だから、一方

  • extends は、親からすべてを取得することを意味します。
  • implements この場合、ほとんどインターフェースの実装のようなものです。子オブジェクトは親であるかのように装うことができます......しかし、それはどんな実装も得られません