|
|
連載
プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――
第19回 継承とポリモーフィズム
(株)ピーデー
川俣 晶
2002/10/05
|
異なる機能と共通の呼び出し方法
VB.NET(Visual Basic .NET)には膨大なクラス・ライブラリが標準で提供され、利用できる。これは、VB 6(Visual Basic 6.0)で利用可能であった多くのステートメントと異なり、プログラム言語に依存せず、C#やマネージC++からも利用されるもので、VB.NET専用というわけではない。そのため、必ずしもVisual Basic流の構造になっているわけではない。基本的には、オブジェクトを作成してメソッドを呼び出したり、プロパティに代入したりすることで利用するわけで、9割以上は特に何かを意識しなくても利用できるかもしれない。しかし、クラス・ライブラリはオブジェクト指向的な考え方に沿って作られており、このような考え方を把握していないと、クラス・ライブラリをどう使えばよいか、判断できない場面もあるだろう。
筆者はオブジェクト指向のプロではないので、オブジェクト指向的な考え方とは何かを説明するのに適任ではない。しかし、Visual Basicプログラマーが引っかかりそうなポリモーフィズムという問題に関して解説することは価値があるだろう。これが何かを理解するだけで、相当クラス・ライブラリが分かりやすくなるのではないかと思う。
ポリモーフィズムとは、共通する性格を持つが内容の異なるオブジェクトをうまく共通的に扱う手法といえる。例えば、プログラムにエラーを管理者に通知する機能を組み込みたくなったとしよう。しかし、通知といっても、いろいろな方法がある。単に画面にメッセージ・ボックスをポップアップする方法もあれば、イベント・ログに記録する方法もあるし、電子メールで送信する方法もある。当然、それらを実現するコーディングも異なる内容になる。取りあえず、ポリモーフィズムを使わず、それを実現するプログラムをVB.NETで記述してみよう。
このプログラムは、前回までのプログラムと違って、少しだけ実用性をイメージしやすいように、ある程度本当に稼働するように作成した。そのため、準備にも少々手間が掛かる。まず、Visual BasicプロジェクトのWindowsアプリケーションのテンプレートを用いて、新しいプロジェクトを作成する。次に電子メール送信の機能を利用するために、System.Web.dllをプロジェクトの参照に追加する。
|
[参照の追加]ダイアログ |
今回のサンプル・プログラムでは電子メール機能を利用するために、まずSystem.Web.dllへの参照を追加する。 |
次にフォーム上にButtonを1個、GroupBoxを1個配置し、GroupBox上にRadioButtonを3個配置する。
|
Visual Studio .NETのデザイン画面 |
フォーム上にButton、GroupBox、3つのRadioButtonを配置しデザインする。 |
そして、それぞれのTextプロパティに適当な文字列を入れ、1番目のRadioButtonのみCheckedプロパティをTrueにしておく。そして、フォーム自身、Button、RadioButtonをそれぞれダブル・クリックして、イベント・ハンドラを作成させる。そして、それぞれのイベント・ハンドラの中身として、以下のようなコードを書き込む。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
|
|
3種類の方法でエラーをレポートする“よくない”サンプル・プログラム1 |
これを実行すると、以下のようになる。
|
サンプル・プログラム1の実行結果 |
[エラーをレポート]ボタンを押すとエラー・レポートが送信されるが、送信方法はその下のラジオ・ボタンの指定による。メッセージ・ボックスを選んでいる場合が以下のようになる。
|
メッセージ・ボックスによるエラー・レポート |
[エラーモード]で[メッセージボックス]を選択した場合。 |
イベント・ログを選んでいる場合は以下のようになる。
|
イベント・ログに出力されたエラー・レポート |
[エラーモード]で[イベントログ]を選択した場合のエラー・レポートはイベント・ログに出力されるため、イベント・ビューアで確認できる。 |
|
イベント・ビューアから表示したイベントのプロパティ |
エラー・レポートの内容を確認することができる。 |
電子メールを選んでいる場合は電子メールで送信される。読むと以下のようになる。
|
メールで送信されたエラー・レポート |
[エラーモード]で[電子メール]を選択した場合のエラー・レポートはメールで送信されてくる。 |
もちろん、本来はボタンを押すとエラー・レポートを出力するのではなく、エラー発生時に出力すべきものだが、その点は単純化した。
Insider.NET 記事ランキング
本日
月間