インタフェースとポリモーフィズム
インタフェースとは?
インタフェースとは、オブジェクト指向の三大要素の1つである「ポリモーフィズム(多態性)」を実現するための仕組みである。
「クラスから実装を取り除き、外部に公開されている仕様のみを定義したもの」。
ポリモーフィズムとは?
ポリモーフィズムとは、同じインタフェースを実装した異なるクラスは、同じ要求をしても異なる動作を行う、という考え方である。
この考え方により、異なる実装を、その違いを意識せずに同じように扱うことが出来る。GoF デザインパターンにおける Comamnd パターンや Strategy パターンはポリモーフィズムの考え方に基づいている。
入門書によく出てくる例えだが、「動物」インタフェースを実装した「犬」クラスと「猫」クラスと「馬」クラスでは、同じ「鳴く」メソッドを呼び出しても実行結果は異なる。
Java におけるインタフェースの特性
Java におけるインタフェースの特性を以下に列挙する。
- インタフェース内のメソッドはシグネチャのみ定義することが出来て、実装を持つことは出来ない(Java 8 からデフォルト実装を持つことが出来るようになった)。
- インタフェースは、初期化されない変数を持つことはできない。
- インタフェース内では、static な変数を定義することはできるが、static なメソッドを定義することはできない。
- インタフェースのインスタンスを生成することは出来ない。従って、コンストラクタを持つことは出来ない。
- インタフェースでは、static final な変数を持つことが出来る。定義を共有するために、インタフェースに定数を宣言する手法があるが(定数インタフェース)、名前空間が汚染されるので推奨されない。
- インタフェースで final メソッドを定義することは出来ない。
- インタフェースは、private なメンバを持つことは出来ない。
- インタフェース を実装するクラスでは、そのインタフェースが持つ全てのメソッドを実装する必要がある。但し、実装クラスが抽象クラスの場合はこの限りではない。イベントリスナインタフェースをインプリメントしたクラスの場合この煩雑さを避けるためには、アダプタクラスを使用すればよい。
- インタフェースがインタフェースを実装(implements)することは出来ない。インタフェースがインタフェースを継承(extends)することは可能。
- インタフェースで定義したメソッドは、暗黙的に public である。