プロトコルとインタフェース
goyaです。
昨日まで前年と比べて暖かかったのだそうですが、今日からまた少し冷え込みましたね。皆さん体調にお気をつけて。
さて、今日はSwiftでいう「プロトコル」、JavaやC#などでいう「インタフェース」という概念についてぼやきます。(※どちらも同じものです。この記事では以下Javaのインタフェースで統一します)
まず、interfaceとは、直訳すると 「境界」や「接続部分」のことです。Protocolは「慣習」や「議定書(ルールなどを取り決めたもの)」という意味です。
モノとモノとをつなぐ場合、例えばUSBメモリとパソコンであればメモリ側の凸とパソコン側の凹がお互いにいい感じの形になっているので差し込んで利用することができます。実はUSBとは接続部分(インタフェース )の規格の一つのことで、USB規格にほとんどのパソコンが則っているため、僕たちはUSBメモリやマウスなどを不自由なく使うことができます。あらかじめ定められた規格や慣習(プロトコル)のおかげで接続部分の形で悩まされることはないのです。
簡単にいうとプログラミングにおけるインタフェースは同じような処理をするメソッドの名前を統一させてわかりやすくするために存在します。
「光る」という処理を行うメソッドを考えた場合、
・ホタルクラス
・カメラクラス
・お星様クラス
という3つのクラス内で、それぞれ
・glowメソッド
・flashメソッド
・twinkleメソッド
と、メソッド名をバラバラにすると、呼び出すときに少しめんどうです。
これを
・hikaruメソッド
に統一すれば、ホタルだから...やカメラだから...と悩まずに済みますね。
もちろん、hikaruメソッドに名前を統一しても、ホタルの「光る」、カメラの「光る」、星の「光る」仕組み(内部の処理)は全く異なるので、
インタフェースには
public interface Hikaru {
public void hikaru() ; //publicは省略可
}
のように、中身のない処理名だけ(定数も定義可)を定義します。
インタフェースを実装したクラスは、以下のようにインタフェースに定義されたメソッドを必ず実装しないといけません。そして実際の処理を各クラスのメソッドに定義します。(1つのクラスで複数のインタフェースを実装することも可能です)
class Hotaru implements Hikaru {
public void hikaru() {
//実際の処理
}
}
独学でSwiftを学んでいたときにプロトコルに出くわして、よくわからずに「中身のないメソッドだけ書いてどうするねん」と思っていたのですがこういうことだったのですね。
一人で開発するときにはあまりメリットは感じられないかもしれませんが、疎結合やらなんちゃらも実現できる大事な概念らしいのでとりあえず頭の片隅にでも置いておこうっと。
0コメント