ここまでで2つのクラスが完成したので、取りあえず実際にコンパイルして実行してみたいところですが、いま作った2つ目のMyApplicationクラスは、いったい誰がインスタンス化して、そのStartメソッドを呼び出してくれるのでしょうか。
■プログラムの実行時に呼び出されるMainメソッド
コンパイラも、プログラムの実行環境であるWindowsも、クラスをインスタンス化するような機能は持っていません。ただしコンパイラによって作成された実行ファイル(EXEファイル)には、それが実行された場合に「Main」という名前のメソッドを呼び出すという機能があります。
つまり、先ほどのMyApplicationクラスのStartメソッドを、まずMainという名前に変更すればよい、ということになります。
しかし、Startメソッドが含まれていたMyApplicationクラスのオブジェクトを作成する者が誰もいません。そんなときに備えて(というわけでもないのですが)、多くのオブジェクト指向言語には「静的メソッド」という、抜け道ともいえる機能が用意されています。
静的メソッドとは、メソッドの定義にstatic(VB.NETではShared)を付けたものです。これを付けておくと、そのメソッドが含まれているクラスをインスタンス化してオブジェクトを作成しなくても、直接そのメソッドを呼び出すことができるようになります。
オブジェクト指向を台無しにしてしまうのではと思わせるような静的メソッドですが、詳細は次回以降で解説するとして、ここではMainメソッドを静的メソッドに変更してプログラムを完成させましょう。
ということで、MyApplicationクラスは次のようになります。なお、Formクラスの方では、WidthプロパティとHeightプロパティを記述(定義)していないので、その操作はコメントアウトしました(コメント文にしました)。
このクラスをコンパイルしてプログラムを実行すると、まずこのMainメソッドが呼び出されることになります。
もちろんプログラムのコンパイルと実行にはFormクラスの定義も必要です。2つのクラスをコンパイルして実行ファイルを作成する前に、Formクラスの方も少し修正します。
■Formクラスの修正
先ほど作成したFormクラスはクラスの外枠しか作っておらず、メソッドの中身はコメントだけだったので、Formクラスを実際にコンパイルすると一部分がコンパイル・エラーとなります。
コンパイルできるように最低限の修正を加えたFormクラスの定義は次のようになります(太字が修正した部分)。
Textプロパティの定義では、それがstring型(文字列型)を返すことになっているので、get部分は文字列を返さないとコンパイル・エラーとなります。
また、いきなりTextプロパティによりタイトルバー文字列の取得が行われた場合に何も返さないというのはさみしいので(string型のフィールドは自動的に空文字に初期化されます)、コンストラクタではbartextフィールドの初期値として“未設定”という文字列を設定しています。
■Visual Studio .NETでコンパイルと実行
ようやく2つのクラスが完成しました。Visual Studio .NETをお持ちの方は、新規プロジェクトで「コンソール・アプリケーション」を選択し、自動的に作成されるコードを全部消してから、いま作成した2つのクラスをそれぞれコピー&ペーストしてみてください。
そして[F5]キーを押すなどして「プログラムの開始」を実行すれば、プログラムはコンパイルされて実行されるはずです。ただし、実際のウィンドウを開くようなコードは1行たりとも書いていないので、当然ながらプログラムを実行しても大したことは起こりません。取りあえずここではコンパイル時にエラーが発生しなければヨシとさせてください。
前述したように、OOPとはすなわち、クラスのプログラミングということになります。コンパイルされたクラスの定義は、実行時にメモリ上にロードされます。
.NETでは、プログラムの実行はまずMainメソッドから始まります。Mainメソッドではクラスをインスタンス化してオブジェクトを作り、そのメソッドを呼び出して処理を開始します。その処理中には、同じようにして別のクラスをインスタンス化してメソッドを呼び出すことになるでしょう。
OOPにより作成されたアプリケーションはこのようにして動作します。実質的にはメソッド呼び出しと呼び出されたメソッドの実行の連鎖的な繰り返しですが、メモリ上には主に、実行時にロードされたクラスと、実行中に作成されたオブジェクトが存在することになります。
さて次回は、OOPの最初の難関ともいえる「継承」についてお話しする予定です。前回および今回は、ウィンドウを表示するFormクラスをプログラミングしてきましたが(実際に作ったのはFormクラスの外枠だけですが……)、実は.NET Frameworkのクラス・ライブラリにはウィンドウを開くための本物のFormクラスが用意されています。次回では、この本物のFormクラスを利用する予定です。
Copyright© Digital Advantage Corp. All Rights Reserved.