連載
プロフェッショナルVB.NETプログラミング
第19回 継承とポリモーフィズム
(株)ピーデー
川俣 晶
2002/10/05
|
|
クラス・ライブラリに見るポリモーフィズムの実例
.NET Frameworkでは各所でポリモーフィズムを活用している。その一例を以下に示そう。フォーム上のPictureBoxにBMPファイルとEMFファイル(拡張メタファイル)を表示するサンプル・プログラムを作成してみた。内部に画像を保持する変数を持たせ、BMPファイルを読み込んでその変数に画像への参照を入れるボタンと、EMFファイルを読み込んでその変数に画像への参照を入れるボタンを用意する、そして、フォーム上のPictureBoxに変数の画像を表示させるボタンも持たせる。こう書くと簡単そうだが、BMPファイルはクラス・ライブラリではSystem.Drawing.Bitmapクラス(Bitmapクラス)が扱い、EMFファイルはSystem.Drawing.Imaging.Metafileクラス(Metafileクラス)が扱うため、同じクラスで処理できないのがポイントである。
ではこのプログラムを作成してみよう。まず、Visual BasicプロジェクトのWindowsアプリケーションの設定を用いて、新しいプロジェクトを作成する。次にフォーム上にPictureBoxを1個、Buttonを3個、配置する。ボタンのラベルには適当な文字列を入れておく。
|
Visual Studio .NETのデザイン画面 |
フォーム上にPictureBoxを1個、Buttonを3個、配置する。 |
プログラム・コードは以下のようになる。
1: Imports System.Drawing.Imaging
2:
3: Public Class Form1
4: Inherits System.Windows.Forms.Form
5:
6: …Windows フォーム デザイナで生成されたコード…
7:
8: Dim img As image
9:
10: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
11: img = New Bitmap("c:\test.bmp")
12: End Sub
13:
14: Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
15: img = New Metafile("c:\test.emf")
16: End Sub
17:
18: Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
19: PictureBox1.Image = img
20: End Sub
21: End Class
|
|
BMPファイルとEMFファイルの両方を表示するサンプル・プログラム6 |
これを実行すると以下のようになる。
|
サンプル・プログラム6の実行例 |
BMPファイルをロードして表示した場合。 |
|
サンプル・プログラム6の実行例 |
EMFファイルをロードして表示した場合。 |
見てのとおり、極めて簡単である。BMPファイルはSystem.Drawing.Bitmapクラスで、EMFファイルはSystem.Drawing.Imaging.Metafileクラスで扱うにもかかわらず、クラスの種類の判定などを行うコードが一切ないのは、ポリモーフィズムのおかげである。実は、System.Drawing.BitmapクラスとSystem.Drawing.Imaging.Metafileクラスは、いずれも、System.Drawing.Imageクラスを継承しており、PictureBoxのImageプロパティもSystem.Drawing.Imageクラスのインスタンスを受け入れるようになっている。つまり、System.Drawing.Bitmapクラスだろうと、EMFファイルのSystem.Drawing.Imaging.Metafileクラスだろうと、インスタンスの参照をSystem.Drawing.Imageクラスの参照に変換できるので、そのままImageプロパティに代入可能というわけである。まさに、ポリモーフィズムの効力が発揮されているといえる。もちろん、ただ単に代入できるだけではなく、PictureBoxクラスは具体的な画像の内容を知ることができ、それを活用して表示することができるわけである。
もし、このような便利な継承関係を意識しないで記述するならソース・コードは以下のようになる。
1: Imports System.Drawing.Imaging
2:
3: Public Class Form1
4: Inherits System.Windows.Forms.Form
5:
6: …Windows フォーム デザイナで生成されたコード…
7:
8: Private imgBitmap As Bitmap
9: Private imgMetafile As Metafile
10: Private bBitmap As Boolean
11:
12: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
13: imgBitmap = New Bitmap("c:\test.bmp")
14: bBitmap = True
15: End Sub
16:
17: Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
18: imgMetafile = New Metafile("c:\test.emf")
19: bBitmap = False
20: End Sub
21:
22: Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
23: If bBitmap Then
24: PictureBox1.Image = imgBitmap
25: Else
26: PictureBox1.Image = imgMetafile
27: End If
28: End Sub
29: End Class
|
|
System.Drawing.Imageクラスの継承関係を意識しないで記述したサンプル・プログラム6 |
行数を比較すれば歴然だろう。ポリモーフィズムを活用すれば21行であったものが、使わないと29行に膨らんでいる。また、ソースの分かりやすさや安全性も低下している。何より重要なのは、.NET Frameworkのクラス・ライブラリはすでに存在するものであって、新たに取り組んで開発すべき新しい何かではないことである。すでにあるものを有効活用するために、ポリモーフィズム(あるいは、より広範囲のオブジェクト指向)という考え方は知っておく価値がある。また、知るだけでなく、実際に使って慣れておくことも有意義だろう。ポリモーフィズムのようなごく基本的な考え方は、いちいち頭で考えて使うものではなく、自然にコーディングしているうちに出てくるべきものである。
Insider.NET 記事ランキング
本日
月間