連載
プロフェッショナルVB.NETプログラミング
第19回 継承とポリモーフィズム
(株)ピーデー
川俣 晶
2002/10/05
|
|
さらにクラス・ライブラリの実例
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クラスであったりしている。
このような挙動を見せるクラスを、トラブルを起こさず活用するには、ポリモーフィズムや継承に関する一通りの知識が必要となる。しかし、ひとたびそれらの知識を得れば、標準で提供されるクラス・ライブラリを活用して、これまでとはひと味違うソース・コードを記述できるようになるだろう。
次回予告
次回はクラス・ライブラリの構造に関する解説を予定している。
Insider.NET 記事ランキング
本日
月間