第4回 継承を使うために知っておくべきこと:連載 オブジェクト指向プログラミング超入門(4/4 ページ)
継承は難しい概念だが、実際のプログラミングで使う継承の機能は限られている。まずは、これだけをマスターしておこう。
オーバーライドより記述が簡潔なイベント
ところで、Visual Studio .NET(以下、VS.NET)でプログラミングしたことのある方は、マウスがクリックされたときの処理は、OnClickメソッドをオーバーライドするような方法ではなく、「Clickイベント」を利用するのが普通なのでは? と思われたかもしれません。
実は、マウスのクリックなどのWindowsメッセージに対応した処理は、メソッドのオーバーライドだけでなく、「イベント」と呼ばれる機能でも記述することができます。
イベントというのはOOPの機能ではありませんが、.NETで導入されている便利な機能です。イベントの仕組みは簡単ではありませんが、それを利用するのは簡単です。イベントの機能を使えば、クリック・メッセージのようなメッセージ処理は非常に簡潔に記述できます。
NewFormクラスで、OnClickメソッドをオーバーライドせずに、イベントを使用して先ほどと同様にフォームがクリックされたらメッセージ・ボックスを表示するためのコードは次のようになります。
*9 VB.NETではHandlesキーワードを利用してイベントを処理するメソッドを指定することも可能。VS.NETが自動作成するコードはHandlesキーワードを使用している。
[記述例]
Sub Form1_Click(ByVal s As Object, ByVal e As EventArgs) Handles MyBase.Click
MessageBox.Show("OOPの世界へようこそ")
End Sub
ここでは詳細は述べませんが、Clickイベントを利用する際のポイントは次の2つです。
- Formクラスは、そのメンバとして「Clickイベント」を持っている。
- Clickイベントに対して登録されているメソッドが自動的に呼び出される(イベントへのメソッドの登録は、C#の場合には+=演算子、VB.NETの場合にはAddHandlerステートメントを利用する。VB.NETではHandlesキーワードを用いてイベントとメソッドを関連付けることも可能)。
Formクラスがメンバとして持っているイベントは、リファレンス・マニュアルを参照すれば分かります。
ここまでに、クラスのメンバの種類としては、フィールド、メソッド、プロパティが登場しましたが、イベントもその1つです。派生クラスではイベントも基本クラスから継承します。
イベントには独自のメソッドを登録することができます。そして、フォームがクリックされたときには、Clickイベントに登録されているメソッドが呼び出される(=Clickイベントが発生する)仕組みになっています。
なお、上記のNewFormクラスの定義では、Formクラスから継承したClickイベントに対してメソッドを登録しましたが、基本的にイベントの仕組みは継承とは関係ありません。Formオブジェクト(あるいはFormクラスを継承したクラスのオブジェクト)のメンバであるClickイベントに、自分で定義したメソッドを登録すればよいだけです。イベントの発生により呼び出されるメソッドでは、オーバーライド時のように基本クラスにあったベースとなるメソッドをわざわざ呼び出してやるといったことも必要もありません。
ちなみに、1つのイベントには複数のメソッドを登録することもできます。この場合には、そのイベントに登録されたメソッドが、イベントの発生時に順に呼び出されます。
イベントと仮想メソッドの関係
Formクラスにはメッセージ処理のための機構が2つも用意されているため、話が少々ややこしくなってきたかもしれませんが、その呼び出しの仕組みはそれほど難しくありません。
Clickイベントに関していえば、Clickイベントに登録されているメソッドを呼び出しているのは、実はFormクラス(正確にはControlクラス)で定義されている、仮想メソッドであるOnClickメソッドです。
図17 FormクラスのOnClickメソッドで記述されているメソッド呼び出し
FormクラスのOnClickメソッドでは、クラスのメンバであるClickイベントからメソッドを取り出し、そのメソッドを呼び出している。
すでに述べたように、マウスがクリックされた場合にはFormクラスのOnClickメソッドが呼び出されます。このOnClickメソッドで行われる処理は、そのクラスのメンバであるClickイベントにメソッドが登録されていれば、それを取り出して実行するというものです。
OnClickメソッドをオーバーライドする場合には、この仕組みを正しく動作させるためにも、オーバーライド・メソッドで基本クラスのOnClickメソッドを呼び出しておく必要があります。そしてそのようにしている限り、イベントでもメソッドのオーバーライドでも、またはそれらを混ぜて使っていても、メッセージを正しく処理することができるようになっていることがお分かりいただけると思います。
Windowsアプリケーションが受け取るメッセージの多くは、Formクラスのこのような仕組みにより処理されています。
さて今回は、継承とは何かを解説し、継承を使って派生クラスを定義する方法や、メソッドをオーバーライドする方法について見てきました。
VS.NETを使ってWindowsアプリケーションを作成する場合には、今回見てきたようなFormクラスを継承したクラスが自動作成されます。これにより、Formクラスで定義されているメソッドやプロパティを利用してプログラミングを進めることができます。ASP.NETを使ったWebアプリケーションも同様です。Webアプリケーションの場合には、自動作成されるコードはPageクラス(System.Web.UI名前空間)の派生クラスとなります。
しかし、実際に継承に触れるのは、このようなVS.NETによる自動生成されたクラスぐらいだったりします。本稿の冒頭で、多くの一般的なWindowsアプリケーションやWebアプリケーションにおいて継承のパターンが限られていると述べましたが、VS.NETにより自動生成されたクラスがまさにそのパターンです。今回はオーバーライドについて詳しく説明しましたが、C#やVB.NETではイベントのおかげでメソッドをオーバーライドすることも実際にはほとんどありません。
では、継承についての知識はこの程度でよいのかというと、そうではありません。実はまだ半分ぐらいです。継承によってもたらされるOOPの重要な仕組みが後に控えています。次回はこれについて解説する予定です。
Copyright© Digital Advantage Corp. All Rights Reserved.