クラスとインターフェイスの違いと使い分け
共通点
- 型(型名(識別子)とメンバ)を定義する。
- あるクラスのインスタンスを、
そのクラスが(直接/間接を問わず)継承したクラス/実装したインターフェイスのインスタンスであるとして扱える。
違い
- クラスはオーバーライドできないメンバを持つことができる。
インターフェイスはオーバーライドできないメンバを持つことができない。 - クラスは継承できないようにできる。
インターフェイスは実装できないようにはできない。 - クラスはバッキングフィールドを持てる。
インターフェイスはバッキングフィールドを持てない。 - 直接継承できるクラスは1つ。
直接実装できるインターフェイスは数に制限なし。
使い分け
インターフェイスではなく(open
(継承可能)な)クラスを使うべきなのは次の場合。
- サブクラスでオーバーライドできないようにしたいメンバがある(テンプレートメソッドパターンなど)
それ以外は基本的にインターフェイスを使うべき。
特に、1つの実装を複数のクラスで使いたいという理由でクラスを継承するのは避けるべき。
これをしてしまうと継承ツリーが何段にも膨れ上がっていき見通しが悪くなっていく。
(詳細は Effective Java 第3版 項目18「継承よりもコンポジションを選ぶ」などを参照されたい。)
/以上