連載

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

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

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

Page1 Page2 Page3 Page4 Page5

クラス・ライブラリに見るポリモーフィズムの実例

 .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のクラス・ライブラリはすでに存在するものであって、新たに取り組んで開発すべき新しい何かではないことである。すでにあるものを有効活用するために、ポリモーフィズム(あるいは、より広範囲のオブジェクト指向)という考え方は知っておく価値がある。また、知るだけでなく、実際に使って慣れておくことも有意義だろう。ポリモーフィズムのようなごく基本的な考え方は、いちいち頭で考えて使うものではなく、自然にコーディングしているうちに出てくるべきものである。


 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 記事ランキング

本日 月間