連載

改訂版
プロフェッショナルVB.NETプログラミング

Chapter 10 継承とポリモーフィズム

株式会社ピーデー 川俣 晶
2004/06/24


 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。

ポリモーフィズム

 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 メールで送信されたエラー・レポート

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


 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 10 継承とポリモーフィズム
    1.Inheritsステートメントによる継承機能/クラス内で継承元クラスのメソッドを呼ぶ
    2.Windows FormにおけるInheritsステートメントの効果/継承時にメソッドの動作を入れ替える/Overridesキーワードを使って継承時にメソッドの動作を入れ替える
    3.中身のないメソッドに対し、継承により中身を入れる/Protectedアクセス/継承を禁止するNotInheritableキーワード
  4.ポリモーフィズム(異なる機能と共通の呼び出し方法)
    5.ポリモーフィズム(ソース・コードの弱点を分析/ポリモーフィズムを用いた書き換え)
    6.クラス・ライブラリに見るポリモーフィズムの実例 - その1/その2
 
「改訂版 プロフェッショナル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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH