|
|
連載
改訂版
プロフェッショナルVB.NETプログラミング
Chapter 10 継承とポリモーフィズム
株式会社ピーデー
川俣 晶
2004/06/24 |
|
|
VB.NETには膨大なクラス・ライブラリが標準で提供され、利用することができる。これは、VB 6で利用可能であった多くのステートメントとは異なり、プログラム言語に依存せず、C#やマネージC++からも利用されるもので、VB.NET専用というわけではない。そのため、必ずしもVisual Basic流の構造になっているわけではない。
基本的に、オブジェクトを作成してメソッドを呼び出したり、プロパティに代入することで利用するわけで、9割以上は特に何かを意識しなくても利用できると思われる。しかし、クラス・ライブラリはオブジェクト指向的な考え方に沿って作られており、このような考え方を把握していないと、クラス・ライブラリをどう使えばよいか、判断できない場面もあるだろう。
筆者はオブジェクト指向のプロではないので、オブジェクト指向的な考え方とは何かを説明するのに適任ではない。しかし、Visual Basicプログラマーが引っかかりそうな、ポリモーフィズムという問題に関して、解説することは価値があるだろう。これが何かを理解するだけで、相当クラス・ライブラリが分かりやすくなるのではないかと思う。
異なる機能と共通の呼び出し方法
ポリモーフィズムとは、共通する性格を持つが内容の異なるオブジェクトをうまく共通的に扱う手法といえる。例えば、プログラムにエラーを管理者に通知する機能を組み込みたくなったとしよう。しかし、通知といっても、いろいろな方法がある。単に画面にメッセージボックスをポップアップする方法もあれば、イベント・ログに記録する方法もあるし、電子メールで送信する方法もある。当然、これらを実現するコーディングも異なる内容になる。取りあえず、ポリモーフィズムを使わずに、これを実現するプログラムをVB.NETで記述してみよう。
このプログラムは、本書の他のプログラムと違って、少しだけ実用性をイメージしやすいように、ある程度本当に稼働するように作成した。そのため、準備にも少々手間が掛かる。
まず、Visual BasicプロジェクトのWindowsアプリケーションのテンプレートを用いて、新しいプロジェクトを作成する。次に、電子メール送信の機能を利用するために、System.Web.dllをプロジェクトの参照に追加する(図10-29)。
|
●図10-29 [参照の追加]ダイアログ |
次にフォーム上にButtonを1個、GroupBoxを1個配置し、GroupBox上にRadioButtonを3個配置してデザインする(図10-30)。
|
●図10-30 Visual Studio .NETのデザイン画面 |
それぞれのTextプロパティに適当な文字列を入れ、1番目のRadioButtonのみCheckedプロパティをTrueにしておく。そして、フォーム自身、Button、RadioButtonをそれぞれダブルクリックして、イベント・ハンドラを作成させる。
次に、それぞれのイベント・ハンドラの中身として、以下のようなコードを書き込む(リスト10-31)。1行目のImports文と、ReportToMessageBox、ReportToEventLog、ReportToEMailの各メソッド、reportModeのメンバ変数は自分で全体を書き込む。
1: Imports System.Web.Mail
2:
3: Public Class Form1
4: Inherits System.Windows.Forms.Form
5:
6: …Windows フォーム デザイナで生成されたコード…
7:
8: Private Sub ReportToMessageBox(ByVal msg As String)
9: MessageBox.Show(msg)
10: End Sub
11:
12: Private Sub ReportToEventLog(ByVal msg As String)
13: If Not EventLog.SourceExists("SampleSource") Then
14: EventLog.CreateEventSource("SampleSource", "SampleNewLog")
15: End If
16: Dim myLog As New EventLog()
17: myLog.Source = "SampleSource"
18: myLog.WriteEntry(msg)
19: End Sub
20:
21: Private Sub ReportToEMail(ByVal msg As String)
22: Dim from As String = "autumn@piedey.co.jp"
23: Dim mailto As String = "autumn@piedey.co.jp"
24: Dim subject As String = "Sample Error Report"
25: Dim body As String = msg
26: SmtpMail.Send(from, mailto, subject, body)
27: End Sub
28:
29: Private reportMode As Integer
30:
31: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
32: reportMode = 0
33: End Sub
34:
35: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
36: Dim msg As String
37: msg = "エラーが発生しました"
38: Select Case reportMode
39: Case 0
40: ReportToMessageBox(msg)
41: Case 1
42: ReportToEventLog(msg)
43: Case 2
44: ReportToEMail(msg)
45: End Select
46: End Sub
47:
48: Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
49: reportMode = 0
50: End Sub
51:
52: Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged
53: reportMode = 1
54: End Sub
55:
56: Private Sub RadioButton3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton3.CheckedChanged
57: reportMode = 2
58: End Sub
59: End Class
|
|
リスト10-31 3種類の方法でエラーをレポートする“よくない”プログラム
|
これを実行すると、図10-32のようなウィンドウが表示される。
|
●図10-32 “よくない”プログラムの実行結果 |
[エラーをレポート]ボタンを押すとエラー・レポートが送信されるが、送信方法はその下のラジオボタンの指定による。[エラーモード]で[メッセージボックス]を選択した場合は、以下のようになる(図10-33)。
|
●図10-33 メッセージボックスによるエラー・レポート |
[イベントログ]を選択した場合は、以下のようになる(図10-34)。イベント・ログに出力されるため、イベント・ビューアで確認できる(図10-35)。
|
●図10-34 イベント・ログに出力されたエラー・レポート |
|
●図10-35 イベント・ビューアから表示したイベントのプロパティ |
[電子メール]を選択した場合は、電子メールで送信される。送信されたメールを開くと、以下のようになる(図10-36)。
|
●図10-36 メールで送信されたエラー・レポート |
もちろん、本来はボタンを押してエラー・レポートを出力するのではなく、エラー発生時に出力すべきものだが、その点は単純化した。
業務アプリInsider 記事ランキング
本日
月間