連載
» 2004年09月25日 00時00分 公開

連載 オブジェクト指向プログラミング超入門:第4回 継承を使うために知っておくべきこと (3/4)

[遠藤孝信,デジタルアドバンテージ]

オーバーライド・メソッドの記述方法

 実際に、NewFormクラスでOnClickメソッドをオーバーライドするメソッド(オーバーライド・メソッドと呼ばれます)を記述すると次のようになります。

 このNewFormクラスを利用したプログラムを実行して、表示されるウィンドウをクリックすると次のようなメッセージ・ボックスが表示されます。

図11 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クラスは次のようなコードとなります。

 図にすると次のようになります。オーバーライド・メソッドでは、まず基本クラスにあるオーバーライドしたメソッドを呼び出すというのが基本ルールです。

図14 基本クラスにあるオーバーライドされたメソッドの呼び出し

 もちろん、Formクラスを継承しているNewFormクラスでも、実際には同様にして基本クラスのメソッドを呼び出している必要があります。全部まとめると次のようになります。

図15 基本クラスにあるオーバーライドされたメソッドの呼び出し

 SuperNewFormクラスのOnClickメソッドの実行時には、基本クラスをさかのぼりながら、すべてのオーバーライド・メソッド(と仮想メソッド)が実行されることになります。

Copyright© Digital Advantage Corp. All Rights Reserved.

編集部からのお知らせ

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。