VBオブジェクト指向プログラミング講座 第17回 継承の種類を知ろう
継承といっても色々な意味があり、大別すると2種類存在します。インタフェース(メソッドの名前・戻り値の型・パラメーター)を継承(再利用)するのか、メソッド内のプログラムを継承(再利用)するのか、それにより継承の意味合いが異なります。VBプログラミングでは、インタフェースを実装するのか、親クラスを指定するのかで対応します。
初心者の方は、この2つの継承はほとんど同じだと感じるでしょう。しかし、意味合いが全く異なります。どちらを使うのかによって、設計レベルで違いが生じます。ですから、同じプログラムを書くのは面倒だから、元からあるクラスを継承しようなどといった感覚で使用すると痛い目にあいます。継承を使用する際には、2つの継承を正しく意味を理解し、設計レベルで熟慮せねばなりません。
インタフェースの継承(実装)は、同じ使い方ができる事を意味します。例えば、2つの整数を引数として受け取り実数を返す演算メソッドは、2つの整数を渡せば何らかの実数値を返すことを意味しています。他には、2つの座標を受け取り何も値を返さないMoveメソッドなどがありえます。
実装の継承は、期待された振る舞いを行う事を意味します。意味はインタフェースの継承よりも難しく、親オブジェクトに期待されている事を実現することを意味します。この継承については、ある程度実務経験がないとわからないと思います。インタフェースの継承との違いは、より強くオブジェクトの定義にしたがう点にあります。
インタフェース継承の場合は、メソッドレベルで求められていることをすれば済みます。しかしながら、実装の継承は、親オブジェクトが求められている条件を満たさないと矛盾が生じます。厄介なことに、VBコンパイラは人間が考えていることはわかりません。ですから、親オブジェクトの仕様と全く違う事をしてもエラーになりません。プログラマーがオブジェクトの仕様をよく考えて、実装の継承を行う必要があります。
具体例を挙げると、子オブジェクトが親オブジェクトのメソッドをオーバーライドしたい場合、いくつかの事を考えねばなりません。親メソッドを内部で呼ぶべきでしょうか?呼ぶにしても、子オブジェクトが先に処理をするのでしょうか?親オブジェクトの処理を先にするのでしょうか?そういったカプセル化に反した判断をせねばなりません。
今までの説明を読んで、「面倒なことを考えたくないからインタフェースの継承だけを使用する」と思った人が居るかもしれません。しかし話はそれほど単純ではありません。実装の継承は面倒な分、正しく設計した時の効果が非常に高くなります。何故ならば、同じようなプログラムを書く必要がなくなるので、生産性が高くなるからです。
どちらの継承をするにしても、設計レベルで熟慮する必要があります。