連載

プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――

第19回 継承とポリモーフィズム

(株)ピーデー
川俣 晶
2002/10/05

Page1 Page2 Page3 Page4 Page5

異なる機能と共通の呼び出し方法

 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の実行結果

 [エラーをレポート]ボタンを押すとエラー・レポートが送信されるが、送信方法はその下のラジオ・ボタンの指定による。メッセージ・ボックスを選んでいる場合が以下のようになる。

メッセージ・ボックスによるエラー・レポート
[エラーモード]で[メッセージボックス]を選択した場合。

 イベント・ログを選んでいる場合は以下のようになる。

イベント・ログに出力されたエラー・レポート
[エラーモード]で[イベントログ]を選択した場合のエラー・レポートはイベント・ログに出力されるため、イベント・ビューアで確認できる。
 
イベント・ビューアから表示したイベントのプロパティ
エラー・レポートの内容を確認することができる。

 電子メールを選んでいる場合は電子メールで送信される。読むと以下のようになる。

メールで送信されたエラー・レポート
[エラーモード]で[電子メール]を選択した場合のエラー・レポートはメールで送信されてくる。

 もちろん、本来はボタンを押すとエラー・レポートを出力するのではなく、エラー発生時に出力すべきものだが、その点は単純化した。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第19回 継承とポリモーフィズム
  1.異なる機能と共通の呼び出し方法
    2.ソース・コードの弱点を分析
    3.ポリモーフィズムを用いた書き換え
    4.クラス・ライブラリに見るポリモーフィズムの実例
    5.さらにクラス・ライブラリの実例
 
「プロフェッショナルVB.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間