はじめに
今回はextendsとimplementsの違いをまとめてみました。
分かっているようで、何と無く使っている人も多いのではないでしょうか。
結構頑張って調べたので読んでくれた方の役に立てれば幸いです。
さっそく本題ですが、extends(継承)とimplements(実装)は全く別物といって差し支えありません。
そういう意味では、そもそもextendsとimplementsの違いを取り上げるのもおかしな話かもしれません。(?)
まあ細かいところはあまり気にせず、今回はそれぞれ一つずつ説明していきます。
結論
1、親クラスの強制実装 | 2、複数指定 | |
---|---|---|
extends | ❌ | ❌ |
implements | ⭕️ | ⭕️ |
※1、implementsは全ての関数をオーバーライドする必要があります。
※2、一つのクラスに対して一つの親クラスのみを継承できるのに比べて、インターフェースは一つのクラスの複数個実装できます。
これだけど不親切かと思いますので、一つずつ説明していきます。
implements(実装)とは
多くの人にとって、extends(継承)の方が親しみがあると思います。
なのであえてimplements(実装)の方から説明させて頂ければと思います。
結論ですが、implementsとはインターフェースの機能を実装するためのものです。
インターフェースとはなんぞやってことですが、以下のサイトでとってもわかりやすいので目を通すことをお勧めします。
簡単にまとめると、インターフェイスとは、implementsで実装したクラスには、任意のメゾットを必ず実装しなければならないという制約のことです。
// インターフェースの定義
abstract class Animal {
void makeSound();
}
// インターフェースを実装するクラス1
class Dog implements Animal {
@override
void makeSound() {
print('ワンワン');
}
}
// インターフェースを実装するクラス2
class Cat implements Animal {
@override
void makeSound() {
print('ニャー');
}
}
上記コードの通り、インターフェース自体の定義はabstractをクラスの前に記載して実装します。
あとはextendsと同じように、implementsでインターフェイスを実装するクラスを作成します。
void main() {
final dog = Dog();
final cat = Cat();
dog.makeSound(); // ワンワン
cat.makeSound(); // ニャー
}
なお上記コードはインターフェイスを実装するクラスを使用する具体例です。
とにかくポイントとしては、インターフェスを実装したクラスは必ず、インターフェースに記載されている関数(メゾット)を必ず全て実装しなければならないことです。
extends(継承)とは
extends(継承)に関しては以下の記事がわかりやすいかと思います。
簡単に説明すると、extends(継承)とはクラスの拡張と呼ばれて、
あるクラスの独自の機能を保持しつつ継承した親クラスのメゾット(関数)や変数も使用することができます。
implemntsよりもよりカスタム性が硬いことが特徴です。
実際のコードを見ていきましょう。
class Animal {
String name;
Animal(this.name);
void makeSound() {
print('$name が音を鳴らしました');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
///親クラスから継承したメゾット
///親クラスから継承したメゾットは実装しなくてもよい。
@override
void makeSound() {
print('$name がワンワンと鳴きます');
}
///親クラスにはないDogクラスの独自メゾット
void fetch() {
print('$name がボールを取ってきます');
}
}
implementsとは異なり、親クラスのメゾットを必ず実装しなければならないという原則はありません。
従って上記のコードでいうところのmakeSound()はコメントアウトしてもうまく動作します。
あくまでextendsはクラスの拡張をイメージすることが大事に思います。
extendsとimplementsの違いについて。
1、親クラスの強制実装 | 2、複数指定 | |
---|---|---|
extends | ❌ | ❌ |
implements | ⭕️ | ⭕️ |
※1、implementsは全ての関数をオーバーライドする必要があります。
※2、一つのクラスに対して一つの親クラスのみを継承できるのに比べて、インターフェースは一つのクラスの複数個実装できます。
参考資料
最後に
読んでいただきありがとうございました。
もし何かこの記事にご指摘などございましたらコメントいただけますと幸いです。