オブジェクト指向プログラミングa 第11回『クラスの継承 (後編)』〜 4. インタフェイスと実装(再考) |
【インタフェイス部と実装部の継承】
ここで,モジュールとしてのクラス,特にその「インタフェイス部分(公開部分)」と「実装部分(非公開部分)」について再考しておこう。
まず,下図 Fig.1 のクラスA の定義を良く観察した上で,モジュールとしてのクラスについて勉強した時に習った,
クラスの「インタフェイス部分(公開部分)」と「実装部分(非公開部分)」がどこに該当するか下図を見て確認すること。
復習になるが,
・「インタフェイス部分(公開部分)」→ 外部に公開されている部分で,利用者はそこを見てそのクラスを利用する。
・「実装部分(非公開部分)」 →外部から隠されている部分で,利用者にとっては見えない部分。従って,利用者にとってはどうでもいい部分。
である(下図:クリックすると補助画像と切り替わります)。
ところで,上図クラスAの公開部分にあるメソッド h( ) はインタフェイス部分に分類したが,本当にメソッド h( ) の定義全体がインタフェイスに属するのだろうか?
メソッドは下図のように,
・シグネイチャ … そのメソッドの名前,返値,引数構成 の部分。要するにメソッドの頭。
・ボディ … 具体的な処理が書かれた { } の部分。要するにメソッドの胴体。
に分けることが出来る。そして,利用者はシグネイチャだけ知っていればこのメソッドを利用できる。
メソッドの利用者からしてみれば,メソッドのボディ部分に書かれている内容は知らなくても良い部分である。
つまり,実質的には公開部分に所属しているメソッドでも,そのシグネイチャ部分だけがインタフェイス部分で,そのボディ部分は実装部と言える。
つまり,公開メソッドであっても,そのシグネイチャ部分だけがインタフェイスとして働き,ボディ部分は実装部として扱われることになる。
この観点から,もう一度クラスA のインタフェイス部と実装部を分析した結果が下図である。
図の説明を確認したら,図をクリックして,利用者からの視点でどこがインタフェイス部で,どこが実装部になるかを今一度確認してみよ。
こうして考えると,下図に示すように,
・メソッドを継承するがオーバライドしない → メソッドのインタフェイス部分(シグネイチャ)も実装部(ボディ)もそのまま継承する。(下図のB1クラスのメソッド m( ) )
・メソッドを継承してオーバライドする → メソッドのインタフェイス部分(シグネイチャ)だけを継承して,実装部(ボディ)はサブクラスで独自に付け直す。(下図のB2クラスのメソッド m( ) )
という事になる。また,
・オーバライドが不可能な finalメソッド →
メソッドのインタフェイス部分(シグネイチャ)と実装部(ボディ)が不可分で,そのまままるごとサブクラスに継承される。 (下図のメソッド f( ) )
という事が分かるだろう。
List 4
この様な考え方が,次に紹介する抽象クラスと抽象メソッドの本質をとらえ,理解し易くしてくれる。