こんにちは、新人のヤマちゃんです。
本日の学習内容をブログで振り返ります。
・抽象クラスとインターフェイス
本日は抽象クラスとインターフェイスについて学習しました。
この2つは似たような機能をもっており、個人的に使い分けで悩むところでもあります。
本記事では、それぞれのコード例を紹介し使い分けをどのように考えればよいか記述していきます。
以下、コード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
// 抽象クラスのコード例 public abstract class Human { public void walk() { // 歩く処理 } // 抽象メソッド public abstract void speak(); } class Yamada extends Human { @Override public void speak() { // 話す処理 } } // インターフェイスのコード例 interface Car { int MAX_SPEED = 300; // final public static は省略できます public abstract void accelerate(); void deceleration(); // public abstract は省略できます } class Track implements Car { @Override public void accelerate() { // 加速する処理 } @Override public void deceleration() { // 減速する処理 } } |
抽象クラスを継承、もしくはインターフェイスを実装させると、実装すべきメソッドを強制できます。
ではこの2つの機能の使い分けはどうすればよいでしょうか。
要点は、多重継承できるか否かです。
クラスはひとつのスーパークラスしか継承できません。
一方、インターフェイスは複数、クラスに実装することが可能です。
結局どっちを使えばいいのか?
クラス仕様としての型定義したいならインタフェース。
継承関係にあって処理の再利用したいなら抽象クラス。
……
抽象クラスと派生クラスは「継承」の関係はIS A関係と呼ばれている対して、
インターフェイスと実装クラスの「実装」の関係はCAN DO関係と呼ばれているそうです。
(引用:インタフェースと抽象クラスどっち使ったらいいんだ?)
クラスの継承(例: 抽象クラスと派生クラスの「継承」の関係)は ISA関係
A extends B
A は Bの一種と見なせる
—-
インタフェースの実装(例:インターフェイスと実装クラスの「実装」の関係)は CAN DO関係
A implements B
A は Bのメソッドが実行できる
(引用:インターフェイス(interface)と抽象(abstract)クラス)
上記の記事では 抽象クラスとインターフェイスの使い分けが簡潔に書かれています。
適切に使い分けていきましょう。
個人的には、インターフェイスのほうがシンプルでわかりやすいので好きです。
スプラトゥーン2のベッチューブキが楽しみですね。