言語仕様とオブジェクト指向
インタフェース
多重継承は、複数のスーパークラスの性質や機能を併せ持つクラスを作りたい場合に利用します。例えば、サブスレッドを生成してファイル入力を行うクラスと、URLで指定したネット上のファイルを読み込めるクラスを多重継承できると便利そうです。ただし、多重継承は複数のクラスのメソッドやインスタンス変数が混在したサブクラスを作るため、利用するスーパークラスの実装を指定し、意図通り動作するように調整する必要があります。
多重継承の1つとして、図1-1のように抽象メソッドを継承する場合もあります。抽象メソッドを用いると、スーパークラスでメソッドの宣言のみ行い、具体的な実装はサブクラスで行うことができます。この方法では、スーパークラスの抽象メソッドとサブクラスのメソッドの実装の間に、必ずしも関連性はありません。
実装をまったく伴わずメソッドの宣言のみの抽象クラスを作ることもできます。JavaやC#では、0個以上のメソッドの宣言の集合をインタフェースと呼びます。これらの言語ではインタフェースをスーパークラスのように継承することができますが、メソッドの実装はサブクラスで行います(図1-2)。インタフェースは複数個指定することもできます。この機能はObjective-Cでプロトコルと呼んでいた言語仕様をJavaが取り入れたものです。
インタフェースは、それを採用した複数のクラスが共通して持つ機能を表現します。例えば図1-3は、画面に表示可能な4種類のクラスを示しています。各クラスの実装はわかりませんが、共通のインタフェースを採用しているため、メソッドsetPositionで画面上の位置を決め、displayで表示を行えることがわかります。さらに、長方形クラスと曲線クラスは線の太さを設定、参照できるインタフェースを採用しているので、実装によらず、同じメソッドで扱えます。
実装継承とインタフェース継承
スーパークラスからメソッド定義やインスタンス変数などの実装を継承するものをクラス継承、あるいは実装継承、インタフェースだけを継承するものをインタフェース継承と呼んで区別することがあります。JavaやC#、Objective-Cなどの言語には多重継承の機能はなく、インタフェースを利用すれば多重継承は不要であるとしています。
続いて実際のクラスの定義と継承を見てみましょう。