継承”と“実装”の違いは、
“継承”の場合、基底クラスの「抽象メソッド」の処理部を実装しないと自身も「抽象クラス」になるだけ
ですが、
実装”の場合は、「インターフェイス」に定義されたメソッドを全てオーバーライドして処理部を実装しなくてはなりません。
実装漏れがあるとその時点で「E_ERROR」エラーを発します。また、“継承”は一度に1つのクラスからしか出来ませんが、“実装”の場合は「,(コンマ)」で区切って複数指定できます。
「インターフェイス」はメンバ変数を持つ事が出来ません'(“インターフェイス”の意味を考えれば、処理内部で使われるプロパティを定義する必要が無いのが解かる。
「インターフェイス」はクラスの様に“オブジェクトの構造を定義するもの”ではなく、“機能の形態を定義するもの”です)が、クラス定数(「インターフェイス定数」と呼ぶ事にする)は定義することが出来ます。
「インターフェイス」が備えるメソッドは全て「パブリック」に宣言しなくてはなりません。それ以外の可視性では「E_ERROR」エラーを発します(そもそも“インターフェイス”は外部に提供するものなので)。アクセス制限修飾子を省略した場合の可視性は「パブリック」なので、「インターフェイス」の定義ではアクセス制限修飾子の宣言は殆ど意味が無いので省略します。
「インターフェイス定数」は、それを所有する「インターフェイス」があるクラスに実装された場合、身分的(?)にそのクラスで定義されたクラス定数となります。
つまり、実装した「インターフェイス」が持つ「インターフェイス定数」と同じ名前のクラス定数を定義出来ません(定数の再定義となって「E_ERROR」エラーを発します)。
“継承”と“実装”は同時に行う事が出来ますが、その場合、
「class 派生クラス名 extends 基底クラス名 implements インターフェイス名」と、“継承”が“実装”の左側に来るようにします。逆にするとシンタックスエラーになります
修飾子 | クラス | インターフェース |
---|---|---|
定義方法 | class クラス名{} | interface インターフェース名{} |
用法 | extends 基底クラス を使って継承 | implements インターフェース名 を使って実装 |
受け継ぎ | 単一継承 | 複数指定がOK |
メンバ変数 | メンバ変数を持ってよい | メンバ変数を持ってはいけない |
可視性 | public以外もOK | 全てpublicでなければならない |
処理の実装 | 全てでなくてよい | 処理を全て実装しなければならない |
拡張 | extendsを使って継承できる | extendsを使ってinterfaceを継承できる |