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

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

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

基本クラスを拡張して新しい機能を追加

 もちろん、中身の何もない派生クラスを作っても、名前の違うクラスが増えるだけで意味がありません。継承を使うメリットの1つは、すでにデバッグが済んで完成している基本クラスを拡張できることです。

 NewFormクラスでは、表示するウィンドウの背景色を赤色にすることにしましょう。クラス・ライブラリのFormクラスは背景色を設定するためのBackColorプロパティを持っています。このプロパティにはColor構造体(System.Drawing名前空間)*2の値を設定すると背景色が変わります。赤色を表す値は「Color.Red」となります。

*2 構造体はクラスによく似たC#やVB.NETの機能です。Color構造体では、あらかじめ代表的な色がプロパティとして定義されています。


 派生クラスのコンストラクタで、Formクラスから継承したBackColorプロパティを設定すれば、この作業は終わりです。コンストラクタは本連載の第2回で解説しているように、クラスのインスタンス作成時に1度だけ呼び出される特別なメソッドで、そのオブジェクトに関する初期化処理を記述します。

 このNewFormクラスを使ってウィンドウを作れば、真っ赤なウィンドウが表示されます。

図8 Formクラスから派生しているNewFormクラス
NewFormクラスでは、そのコンストラクタでウィンドウの背景色を赤色に設定しているため、NewFormクラスが表示するウィンドウは赤色となる。

 NewFormクラスでは、その基本クラスであるFormクラスを拡張していることになります。NewFormにより表示されるウィンドウは、Formクラスが表示するウィンドウの機能(最小化、最大化、リサイズが可能など)に加えて、背景が赤であるという機能(機能というほどではありませんが)が追加されています。

 別の書き方をすれば、継承により、既存のFormクラスを再利用しながら新しい機能だけを新たに実装することができます。これは「差分プログラミング」と呼ばれることもあります。

 なお、継承によりクラスを定義した場合は、コンストラクタの実行には少し注意する必要があります。このNewFormクラスの場合では、そのインスタンスが正しく初期化されるには、プログラムの実行時に、このクラスのコンストラクタに加えて、その基本クラスであるFormクラスのコンストラクタも実行されていなければなりません。そして、それは派生クラスのコンストラクタよりも前である必要があります。

 このため、コンストラクタの実行に関しては、まず基本クラスのコンストラクタが実行され、次に派生クラスのコンストラクタが実行されるという暗黙のルールがあります*3

*3 baseキーワード(VB.NETの場合にはMyBaseキーワード)を利用して、コンストラクタの呼び出しを明示的に記述することもできます。


既存メソッドを書き換える「メソッドのオーバーライド」

 継承は、新しい機能を追加するだけでなく、既存の機能を差し替えることにより、基本クラスを拡張することができます。具体的には、基本クラスのメソッド(あるいはプロパティ)を派生クラスで再定義して、置き換えるというものです。これは「メソッドのオーバーライド(override)」と呼ばれます。

 単に派生クラスで新しくメソッドを追加するのではなく、既存のメソッドを置き換えるということにはどのような意味があるのでしょうか。

 例えば、Formクラスは「OnClick」という名前のメソッドを持っています*4。OnClickメソッドは、表示しているウィンドウがクリックされたら自動的に呼び出されるメソッドです。

*4 実際には、このOnClickメソッドは、その基本クラスであるControlクラスから継承したものです。


 ここで前回の「Windowsアプリケーションのメッセージ・ループ」で解説した内容を思い出してください。フォームがクリックされると、メッセージ・ループを実行するApplicationクラスのRunメソッドは、クリックされたというメッセージを受け取ります。そしてそれは、最終的には特定のメソッドの呼び出しになるということを説明しました。この最終的に呼び出されるメソッドが、FormクラスのOnClickメソッドです。

 Formクラスにおいて、OnClickメソッドが呼び出されるまでの仕組みを、大まかな図にすると次のようになります。

図9 FormクラスのOnClickメソッドが呼び出されるまでの仕組み
ApplicationクラスのRunメソッドがクリック・メッセージを受け取ったら、そのメッセージはFormクラスにある「メッセージ処理メソッド」に渡され、そこからさらにOnClickメソッドが呼び出される。

 図9で示しているように、ApplicationクラスのRunメソッドは、マウスがクリックされたというメッセージを受け取ったら、そのメッセージをFormクラスにある「メッセージ処理メソッド」*5に渡します。このメソッドは、さまざまなメッセージを各メソッドに振り分けるためのメソッドであり、多くのメッセージに対しては、メッセージ処理のためにあらかじめFormクラスに用意された「On〜メソッド」を呼び出します。マウスのクリックの場合には、これがOnClickメソッドとなります*6

*5 実際にはControlクラスから継承した「WndProc」という名前のメソッドです。これは.NET以前のWindowsプログラミングでは、ウィンドウ・プロシージャ(ウィンドウ関数)と呼ばれていたものに相当します。


*6 実際には「マウスのクリック」というメッセージはなく、ボタンが押されたときにフラグを立てておき、その状態のまま、続いてボタンが離されたときにOnClickメソッドが呼ばれます。


 オーバーライドにより基本クラスのメソッドを置き換える意図は、こういった一連の仕組みをそっくりそのまま派生クラスでも利用するためです。

 NewFormクラスでOnClickメソッドをオーバーライドにより再定義した場合には、図9は次のようになります。

図10 NewFormクラスのOnClickメソッドが呼び出されるまでの仕組み
FormクラスのOnClickメソッドが呼び出される仕組みを、Formクラスの派生クラスであるNewFormクラスでも利用することができる。

 マウスのクリック時にFormクラスのOnClickメソッドが自動的に呼び出されたように、OnClickメソッドをオーバーライドしているメソッドを持ったクラスを継承により定義することで、自動的に呼び出されるメソッドを独自のものと差し替えることができるわけです。ここではフォームがクリックされたら、MessageBoxクラスを使ってメッセージ・ボックスを表示することにしました*7

*7 メッセージ・ボックスの表示に関しては「.NET TIPS:メッセージ・ボックスを表示するには?」を参照してください。


 オーバーライドしたメソッドの記述について詳しく見ていきましょう。

Copyright© Digital Advantage Corp. All Rights Reserved.

編集部からのお知らせ

RSSについて

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

メールマガジン登録

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