TypeScript継承と実装の違い
extends
「extends」は、クラスの継承に使用されます。継承は、あるクラス(子クラス)が別のクラス(親クラス)の特性を継承する仕組みです。子クラスは親クラスのメソッドやプロパティを再利用できるため、コードの重複を減らし、保守性を向上させることができます。
implements
「implements」は、インターフェースの実装に使用されます。インターフェースは、クラスが持つべきメソッドやプロパティの型やシグネチャを定義するものです。クラスが「implements」キーワードを使用してインターフェースを実装すると、そのクラスはインターフェースで定義されたすべてのメンバーを実装する必要があります。これにより、コードの型安全性と一貫性を確保することができます。
違い
「extends」と「implements」の主な違いは、継承と実装の概念にあります。
- implements
クラスがインターフェースの定義に従ってメンバーを実装する。 - extends
子クラスが親クラスの特性を継承する。
具体的な例
// 親クラス
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
speak() {
console.log("I am an animal.");
}
}
// 子クラス
class Dog extends Animal {
bark() {
console.log("Woof!");
}
}
// インターフェース
interface Flyable {
fly(): void;
}
// インターフェースを実装するクラス
class Bird implements Flyable {
name: string;
constructor(name: string) {
this.name = name;
}
speak() {
console.log("I am a bird.");
}
fly() {
console.log("I can fly!");
}
}
この例では、「Dog」クラスは「Animal」クラスを継承し、「Bird」クラスは「Flyable」インターフェースを実装しています。
TypeScriptにおける「extends」と「implements」の例
extends(継承)の例
// 親クラス (Animal)
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
speak() {
console.log("I am an animal.");
}
}
// 子クラス (Dog)
class Dog extends Animal {
bark() {
console.log("Woof!");
}
}
// 子クラス (Cat)
class Cat extends Animal {
meow() {
console.log("Meow!");
}
}
- Dog クラスは独自の
bark()
メソッドを持ち、 Cat クラスは独自のmeow()
メソッドを持ちます。 - Dog と Cat クラスは Animal クラスを継承しています。これにより、両クラスは
name
プロパティとspeak()
メソッドを自動的に継承します。 - Animal クラスは親クラスで、名前と
speak()
メソッドを持っています。
implements(実装)の例
// インターフェース (Flyable)
interface Flyable {
fly(): void;
}
// インターフェースを実装するクラス (Bird)
class Bird implements Flyable {
name: string;
constructor(name: string) {
this.name = name;
}
speak() {
console.log("I am a bird.");
}
fly() {
console.log("I can fly!");
}
}
- Bird クラスは、Flyable インターフェースの要件を満たすため、
fly()
メソッドを実装しています。 - Bird クラスは Flyable インターフェースを実装しています。これにより、Bird クラスは
fly()
メソッドを実装する必要があります。 - Flyable インターフェースは、
fly()
メソッドを持つことを定義しています。
継承と実装の違い
- 実装は、クラスがインターフェースの定義に従ってメンバーを実装する関係です。クラスはインターフェースで定義されたすべてのメンバーを実装する必要があります。
- 継承は、クラスが別のクラスの特性を継承する関係です。子クラスは親クラスのメソッドやプロパティを再利用できます。
- 適切に使い分けることで、TypeScriptのプログラミングをより効率的に行うことができます。
- implements を使用してインターフェースを実装することで、コードの型安全性と一貫性を確保することができます。
- extends を使用してクラスを継承することで、コードの再利用性と保守性を向上させることができます。
// 親クラス (Animal)
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
speak() {
console.log("I am an animal.");
}
}
// 子クラス (Dog)
class Dog extends Animal {
bark() {
console.log("Woof!");
}
}
// 子クラス (Cat)
class Cat extends Animal {
meow() {
console.log("Meow!");
}
}
// インターフェース (Flyable)
interface Flyable {
fly(): void;
}
// インターフェースを実装するクラス (Bird)
class Bird implements Flyable {
name: string;
constructor(name: string) {
this.name = name;
}
speak() {
console.log("I am a bird.");
}
fly() {
console.log("I can fly!");
}
}
typescript extends implements