実際に、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の条件を図示すると次のようになります。
なお、クラス・ライブラリにあるFormクラスのOnClickメソッドが仮想メソッドとして宣言されているのは、その派生クラスでオーバーライドされることを最初から想定して作成されているためです。
メソッドをオーバーライドするときの決まり事が、実はもう1つあります。それは、オーバーライド・メソッドでは、基本クラスのオーバーライドされたメソッドを呼び出してやらなければならないということです。オーバーライドはメソッドを置き換えますが、置き換えられた基本クラスのメソッドは消えてしまうわけではなく、オーバーライド・メソッドからいつでも呼び出すことができます。
例えば、いまNewFormクラスではOnClickメソッドをオーバーライドして、メッセージ・ボックスを表示するようにしました。さらに、NewFormクラスを継承する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.