第4回 継承を使うために知っておくべきこと:連載 オブジェクト指向プログラミング超入門(3/4 ページ)
継承は難しい概念だが、実際のプログラミングで使う継承の機能は限られている。まずは、これだけをマスターしておこう。
オーバーライド・メソッドの記述方法
実際に、NewFormクラスでOnClickメソッドをオーバーライドするメソッド(オーバーライド・メソッドと呼ばれます)を記述すると次のようになります。
このNewFormクラスを利用したプログラムを実行して、表示されるウィンドウをクリックすると次のようなメッセージ・ボックスが表示されます。
オーバーライド・メソッドを記述する場合には、いくつか決まり事があります。第1に、オーバーライド・メソッドには、それを示すためにoverride(VB.NETの場合にはOverrides)を付けてメソッドを宣言します。
第2に、オーバーライド・メソッドは基本クラスのオーバーライドされるメソッドと同じパラメータを持ち、戻り値も同じ型で、メソッドのアクセス修飾子も同じでなければなりません(これらはメソッドの「シグネチャ」と呼ばれます)。
リファレンス・マニュアルでFormクラスを調べると、OnClickメソッドのシグネチャを知ることができます。これは次のようになっています。
第3に、オーバーライドされるメソッドは、メソッドの宣言部分にvirtual(VB.NETではOverridable)が付いていなければなりません。OnClickメソッドはこの条件を満たしています。virtualが付いたこのようなメソッドは、「仮想メソッド」と呼ばれることがあります。VB.NETのOverridableキーワードから分かるように、仮想メソッドはオーバーライド可能なメソッドです。
あるいは、オーバーライドされるメソッドは、オーバーライド・メソッド(つまり、overrideが付いている)でなければなりません。いまNewFormクラスで記述したOnClickメソッドはオーバーライド・メソッドなので、このNewFormクラスをさらに継承したクラスでも、オーバーライドしたOnClickメソッドをさらにオーバーライドすることができるということです*8。
*8 実際にはabstruct(VB.NETではMustInherit)が付いた抽象メソッドもオーバーライドできます。抽象メソッドについては次回で解説する予定です。
第3の条件を図示すると次のようになります。
図12 オーバーライド可能なメソッド
virtual(VB.NETではOverridable)あるいはoverride(VB.NETではOverrides)が付いたメソッドを派生クラスではオーバーライドできる。
なお、クラス・ライブラリにあるFormクラスのOnClickメソッドが仮想メソッドとして宣言されているのは、その派生クラスでオーバーライドされることを最初から想定して作成されているためです。
オーバーライドされたメソッドの呼び出し
メソッドをオーバーライドするときの決まり事が、実はもう1つあります。それは、オーバーライド・メソッドでは、基本クラスのオーバーライドされたメソッドを呼び出してやらなければならないということです。オーバーライドはメソッドを置き換えますが、置き換えられた基本クラスのメソッドは消えてしまうわけではなく、オーバーライド・メソッドからいつでも呼び出すことができます。
例えば、いまNewFormクラスではOnClickメソッドをオーバーライドして、メッセージ・ボックスを表示するようにしました。さらに、NewFormクラスを継承するSuperNewFormクラスを定義して、OnClickメソッドをオーバーライドしたとしましょう。
図13 NewFormクラスを継承したSuperNewFormクラス
SuperNewFormクラスのOnClickメソッドは基本クラスの同メソッドを置き換えてしまうため、オーバーライドされた基本クラスの処理は行われない。
このSuperNewFormクラスのOnClickメソッドは、NewFormクラスのOnClickメソッドを置き換えてしまうため、そのままでは表示されたウィンドウをクリックしても、NewFormクラスのメッセージ・ボックスは表示されません。これでは、基本クラスで実装された機能を、そこで意図されたとおりに活用することはできません。
そこで、オーバーライド・メソッドで、オーバーライドされた基本クラスのメソッドを明示的に呼び出してやります。これには、baseキーワード(VB.NETではMyBaseキーワード)を使用します。baseキーワードは、そのクラスの基本クラスで定義されているメンバにアクセスするためのものです。
OnClickメソッドを正しくオーバーライドしているSuperNewFormクラスは次のようなコードとなります。
図にすると次のようになります。オーバーライド・メソッドでは、まず基本クラスにあるオーバーライドしたメソッドを呼び出すというのが基本ルールです。
もちろん、Formクラスを継承しているNewFormクラスでも、実際には同様にして基本クラスのメソッドを呼び出している必要があります。全部まとめると次のようになります。
SuperNewFormクラスのOnClickメソッドの実行時には、基本クラスをさかのぼりながら、すべてのオーバーライド・メソッド(と仮想メソッド)が実行されることになります。
Copyright© Digital Advantage Corp. All Rights Reserved.