【Java入門(3)オブジェクト指向:活用編 #8】インタフェース

 

みのる
こんにちは。笑顔で感謝!✨ みのるコーチです。
今回も、ご覧いただき、ありがとうございます。

今回は…

Java入門3 オブジェクト指向:活用編 #8
インタフェース

というテーマでお送りします。

彩香
オブジェクト指向活用編も 最終回なんですね。
今回も、プログラミングを楽しみます。

今回も、よろしくお願いします。

剛留
ポリモフィズムの考え方が 面白いです。
その集大成ですね。今回も、頑張ります!

【1】 ポリモフィズムの実現

みのる
それでは、前回の簡単な おさらいから…

ポリモフィズム(多態性)とは

オブジェクトが異なる振る舞いをする部分を
同一のメソッド呼出しで、扱えること です。

ポリモフィズム(多態性)
オブジェクトが異なる振る舞いをする部分を
同一のメソッド呼出しで扱えること。

複数のオブジェクトに
異なる振る舞いをする メソッドがある時に…

1つのメソッド呼出しで、扱いたい場合です。

この時に、まとめの箱を用意して…

まとめ.メソッド名();

…と、1つのメソッド呼び出しで 表現できると
スッキリする というお話をしました。

この時の

「まとめの箱」

Javaでの実現方法として、前回は…

「抽象クラス」

の解説をしました。

そして、今回は

「インタフェース」

での、実現方法を見ていきましょう。

みのる
もう一つ、抽象メソッドについても
振り返っておきましょう。

抽象メソッドは、ポリモフィズムで
共通の呼び出しを実現するため…

シグネチャ(メソッド名・引数パターン)と
戻り値 だけを定義するメソッド です。

そして、抽象メソッドには
処理内容の記述は しません。

抽象クラスの中では
abstract修飾子をつけて表します。

抽象メソッド
✅ ポリモフィズムで共通の呼び出しを実現するため
  シグネチャ(メソッド名・引数パターン)と戻り値
  だけを定義するメソッド。

✅ 処理内容の記述はない。

✅ 抽象クラスの中では abstract修飾子をつけて表す。

さきほどの「まとめの箱」で
定義するメソッドです。

呼び出す形を 定義しておくもの

でしたね…。

この前提を元に、今回のインタフェースを
見ていきましょう。

彩香
復習、完了です!
剛留
余裕の、よっちゃん!

【2】 インタフェース

それでは、インタフェースの
イメージから 見ていきましょう。

この、インターフェースは…

クラスが利用しやすいように、表面に装着しておく…

「タッチパネル」

のようなものです。

そのタッチパネルには、クラスを利用するための
操作ボタンが付いています。

操作ボタンは「印刷する」「表示する」「挨拶する」など
端的に表現される場合が多いもの。

そして、このボタンを押すと、装着されている実体
によって、異なった振る舞いをします。

クラス独自の振る舞いですね。

この、同じ種類のタッチパネルは、複数のクラスに
装着しておくことができます。

ですので、そのタッチパネルを装着したクラスは…

操作ボタンの具体的な処理を
準備しておく必要があります。
みのる
この タッチパネル・操作ボタンをイメージしながら
Javaでの実現方法を見ていきましょう。

インタフェースは「境界面」「接点」「仲介する」
という 意味があります。

そして Javaでのインタフェースは

クラスと利用する側の「接点」で
「仲介する」役割を持っています。

先程の タッチパネルを装着することを Javaでは

「インタフェースを実装する」

と言います。

そして、タッチパネルについていた
操作ボタンは、Javaでは…

「抽象メソッド」

です。

インタフェースには
抽象メソッドが定義されている ことになりますね。

そして、インタフェースを実装したクラスは…

そのインタフェースで定義された 抽象メソッドを
オーバーライド しておく必要があります。

インタフェースはクラスに対して…

「抽象メソッドをオーバーライドして
処理を作っておいてください。」

と言います。

一方で インタフェースは、クラスを利用する側に対しては
抽象メソッド(呼び出し方の形)を示して…

「この形でメソッドを呼び出してください。
クラス毎に、適切な処理をしますから。」

と言うわけですね。

このように、インタフェースは…

クラス側と利用する側の

「接点」で「仲介する」

イメージになるのです。

また、もう1つインタフェースの特徴を
お伝えしておきますね。それは…

1つのクラスに
複数のインタフェースを実装できる。

ということです。

以前に、クラスの継承のところで お話しましたが…

あるクラスからみて
スーパークラスは、1つにする必要がありました。

これを単一継承といいましたね。

これに対して インタフェースは、複数の実装が可能です。

「多重実装」

といいます。

これも、インタフェースの持つ 強力な特徴です。

これは、クラスを扱う場合を考えると…

実装している インタフェース毎に
複数の切り口で 考えられる。

という事になるのです。

彩香
インタフェースは、メソッド呼び出しのカタチなんかを指定して
クラス側と利用する側の仲介をする役割なんですね。

そして、実際の処理(振る舞い)は実装するクラスで定義するから
ポリモフィズムが実現するという事なんですね。

じわじわ、解ってきましたよ!

剛留
複数のインタフェースを実装できるのも
面白いですね。

着目できる側面が複数あるので
小さく分割して考えやすいと言えますね。

面白くなってきましたね。ワクワクです。
引き続き、全集中で見ていきます。

【3】 Javaでの表現

みのる
インタフェースの Javaでの表現を見ていきましょう。

① 定義

(書き方)
アクセス修飾子 interface インタフェース名 {

  戻り値の型 抽象メソッド名(型 引数,…);

}

(例)
public interface Shippable {

  void ship();

}

インタフェースは
キーワード interface を使って定義します。

interface インターフェース名 {}(波括弧)

で、インタフェースのブロックを記述します。

インタフェース名は Javaの慣習で
アッパーキャメルケースで記述します。

先頭が大文字で、以降は
単語の区切りの先頭が大文字です。

インタフェースに記述できるのは

❶抽象メソッド
❷定数
❸defaultメソッド(Java8以降)
❹staticメソッド(Java8以降)

となりますが、今回は ポリモフィズム実現のための
抽象メソッドを 見ていきましょう。

抽象メソッドは

戻り値の型 抽象メソッド名 引数の型 引数名

を書いて セミコロンで終了します。

メソッドの処理ブロックは、記述できません。

また、抽象クラスの中で記述する場合には
abstract修飾子 をつけて記述していましたが…

インタフェースの中では abstract を
つけなくても 抽象メソッドの意味になります。

そして、抽象メソッドの アクセス修飾子は
記述しない場合もpublic と扱われます。

②実装

(書き方)
アクセス修飾子 class クラス名
    implements インタフェース名1, インタフェース名2,… {
  :
 (抽象メソッドのオーバーライド必須)
  :
}
(例)
public class LogisticEmployee
    implements ExtPrintable, Shippable {
   :
  @Override
  public void print() {
    (処理ブロック記述)
  }
   :
}

インタフェースをクラスに実装する時には
このようにクラス定義の後に

キーワード「implements」

を使用してその後に
インタフェース名を記述します。

複数のインタフェースを 実装する場合には
カンマで区切って 記述します。

そして、インタフェースを実装したクラスは
抽象メソッドの オーバーライドが必須となります。

③利用

インタフェース型 変数 = new 実装クラス();

(インタフェース型へのアップキャスト)

変数.メソッド名() → 実装クラスのメソッド実行

(ポリモフィズム)

インタフェースを実装したクラスを
インスタンス化して 利用する時に…

この インタフェース型の変数や配列に
代入して扱う事ができます。

そして、インタフェースで定義された
抽象メソッドを 呼び出すと…

そのインタフェースを 実装したクラスのメソッドが
実行されるという ポリモフィズム が実現されるのです。

この場合に
そのインタフェースを実装した 複数のクラスを…

インタフェースの枠組みに着目して
扱うことができる という利点があるのです。

【4】 クラス図

クラス図での、インターフェース 表現を
見ておきまよう。

クラスと同じように記述しますが…
インターフェース名の上に

<<interface>>

と記述します。

ここで、一般に、この <<(小なり2つ)>>(大なり2つ)
の形式で 記述する方法を

「ステレオタイプ」

といいます。

また クラスとインタフェースの関係は
破線(点線)で表して

インタフェース側に△印を記述します。

関係性は「実現」といいます。

クラスが インタフェースの仕様を
実現する。

という意味です。

【まとめ】

【1】 ポリモフィズムの実現
✅ 抽象クラスを使う方法と
  インタフェースを使う方法がある。

✅ 抽象メソッドを定義して
  呼び出し方をを規定する。

【2】 インタフェース
✅ 「クラス側」と「利用する側」の
  接点で、仲介役 となる。

✅ クラス側には、メソッドの
  オーバーライド(実装)を依頼。

✅ 利用する側には、メソッドの
  使い方を案内。

【3】 Javaでの表現
✅ キーワード interface で定義。

✅ クラスに実装するには
  キーワード implements を使用。

✅ インタフェースを実装したクラスは
  抽象メソッドのオーバーライドが必須。

【4】 クラス図
✅ クラス同様の記述方法となるが
  インタフェース名の上に
  <<interface>> と記述する。

✅ クラスとインタフェースの関係は
  破線で表して、インタフェース側に
  △印を記述する。

✅ 関係性は「実現」という。