連載

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

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

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

Page1 Page2 Page3 Page4 Page5

さらにクラス・ライブラリの実例

 System.Drawing.Imageクラスには、FromFileという名前のSharedなメソッドがある。このメソッドはBMPファイルやEMFファイルを読み込む機能を持っている。読み込んだ結果は、System.Drawing.Imageクラスのインスタンスへの参照として返される。しかし、System.Drawing.Imageクラスは抽象的なクラスであって、BMPファイルを持てるのはSystem.Drawing.Bitmapクラスであり、EMFファイルはSystem.Drawing.Imaging.Metafileクラスであるはずだ。このなぞを解くには、実際にFromFileメソッドが返しているインスタンスのクラスがSystem.Drawing.Bitmapクラスであったり、System.Drawing.Imaging.Metafileクラスであったりするという事実を知らねばならない。定義上、このメソッドはSystem.Drawing.Imageクラスのインスタンスへの参照を返すことになっているが、このクラスを継承したクラスのインスタンスへの参照が返されてもコンパイラはエラーにならないのである。実際にそれを確認するサンプル・プログラムを記述してみた。

  1: Public Class Form1
  2:   Inherits System.Windows.Forms.Form
  3:
  4: …Windows フォーム デザイナで生成されたコード…
  5:
  6:   Dim img As Image
  7:
  8:   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  9:     img = Image.FromFile("c:\test.bmp")
 10:   End Sub
 11:
 12:   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
 13:     img = Image.FromFile("c:\test.emf")
 14:   End Sub
 15:
 16:   Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
 17:     PictureBox1.Image = img
 18:     Label1.Text = img.GetType().FullName
 19:   End Sub
 20:
 21: End Class
System.Drawing.ImageクラスのFromFileメソッドを試したサンプル・プログラム7

 これを実行すると以下のようになる。

サンプル・プログラム7の実行例(BMPファイルをロードして表示した場合)
画面一番下にはフォーム上に表示しているオブジェクトのクラス名を表示している。
 
サンプル・プログラム7の実行例(EMFファイルをロードして表示した場合)

 このサンプル・プログラムでは、フォーム上に表示しているオブジェクトのクラス名を表示するためのLabelを追加している。簡単な内容なので、詳しい説明はくどくど行わない。18行目で、Imageプロパティに代入したインスタンスのGetTypeメソッドを呼び出して型情報を得て、FullNameプロパティでクラス名を得ている。表示結果を見て分かるとおり、FromFileメソッドの戻り値の型はSystem.Drawing.Imageであるが、実際に返されているのは、System.Drawing.Bitmapクラスであったり、System.Drawing.Imaging.Metafileクラスであったりしている。

 このような挙動を見せるクラスを、トラブルを起こさず活用するには、ポリモーフィズムや継承に関する一通りの知識が必要となる。しかし、ひとたびそれらの知識を得れば、標準で提供されるクラス・ライブラリを活用して、これまでとはひと味違うソース・コードを記述できるようになるだろう。

次回予告

 次回はクラス・ライブラリの構造に関する解説を予定している。End of Article


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

本日 月間