さて、少し My から内容がずれるのでエントリのタイトルからははずしましたが、My を使うかどうか考える。その3。で書いたVisual Basic アプリケーション モデルをちょっくら吟味してきました。参考先は以下↓
MSDN:Visual Basic アプリケーション モデルの概要(http://msdn2.microsoft.com/ja-jp/library/w3xx6ewx(VS.80).aspx)
MSDN:Visual Basic アプリケーション モデルの拡張(http://msdn2.microsoft.com/ja-jp/library/ms233841(VS.80).aspx)
どういった内容かというと、Windows フォーム アプリケーション での動作をある程度モデルとして作ってしまおう、ってことのようです。つまり、実業務に依存しない部分、お決まりコードを書かなくていいようにすればいいやん♪ってことですね。Visual Basic アプリケーション モデルの概要では、大まかな概要が、Visual Basic アプリケーション モデルの拡張ではその拡張方法の解説がなされていますね。←そのまんま。
で、今回焦点を当てるのは拡張のほうです。拡張の方法とはどういったモノなのでしょうか。
Visual Basic アプリケーション モデルのフローですが、Visual Basic アプリケーション モデルの拡張の中に分かりやすい図があるのでそれを追っていただければ問題ないかと思います。簡単に書くと、Main
プロシージャ が My.Application.Run メソッドを呼び出し、その中で、順次 OnXXXXなメソッド(OnInitialize→OnStartup→OnRun→OnShutdown)が呼び出される、という仕組みです。
で、ここで拡張のキモです。実はその OnXXXX なメソッドは オーバーライド可能 になっているのです。つまり、それらを オーバーライドすることによってモデルを拡張するわけですね。
ちょっと試してみましょう。 Visual Studio 2005 を使用して Visual Basic で WindowsApplication プロジェクトを作成します。プロジェクト名は「WindowsApplication1」でいいです。で、そこに新しいファイル「MyApplication.Overrides.vb」を作成します。内容は以下のとおりです。
Imports System
Namespace My
Partial Class MyApplication
Protected Overrides Function OnInitialize _
(ByVal commandLineArgs As System.Collections.ObjectModel.ReadOnlyCollection(Of String)) As Boolean
Console.WriteLine("OnInitialize")
Return True
End Function
Protected Overrides Function OnStartup _
(ByVal eventArgs As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) As Boolean
Console.WriteLine("OnStartup")
Return True
End Function
Protected Overrides Sub OnRun()
Console.WriteLine("OnRun")
End Sub
Protected Overrides Sub OnShutdown()
Console.WriteLine("OnShutdown")
End Sub
End Class
End Namespace
コレを実行してみると出力ウィンドウには
OnInitialize
OnStartup
OnRun
OnShutdown
が表示されますね。My.Application.Run メソッドから順次呼び出されるとは、こういうことのようです。つまり、Visual Basic アプリケーション モデルは、これらのメソッドのオーバーライドによって拡張可能である、ということですね。
いままで、'Visual Basic 特有の' と聞くと「えー。」って思っていましたが、なんだかこのあたりは嫌いじゃないです。ただ、このモデルのことが意外と知られていないような気がするのですが、これって私が思うだけでしょうか・・・?