連載
プロフェッショナルVB.NETプログラミング
第10回 オブジェクト関連(後編)
(株)ピーデー
川俣 晶
2002/06/22
|
|
既定のプロパティ
VB 6では、既定のメソッドやプロパティを持つことができる。これは、インスタンスだけを指定した場合に指定されたと見なされるメソッドやプロパティのことである。例えば、フォーム上のテキストボックスに文字列を代入するときは、
TextBox1.Text = "Hello!"
のように記述するが、Textプロパティは既定のプロパティであるため、.Textを省いて、
TextBox1 = "Hello!"
と書いても等価である。
では、実際にそういうサンプル・プログラムを記述してみよう。まず、以下のようなプロパティを持つクラス・モジュールを書いてみた。
1: Private str As String
2:
3: Public Property Get test1() As String
4: test1 = str
5: End Property
6:
7: Public Property Let test1(s As String)
8: str = s
9: End Property
|
|
プロパティtest1を持つクラスを定義したVB 6のサンプル・プログラム25 |
次に、[ツール]メニューの[プロシージャ属性]を選んで、[詳細]ボタンを押し、名前test1に対応する[プロシージャID]を“(既定値)”に変更する。
|
VB 6の[プロシージャ属性]ダイアログ |
プロパティtest1を既定のプロパティに設定することができる。
|
これで、プロパティtest1は既定のプロパティになったので、以下のようなコードを記述できるようになる。
1: Private Sub Form_Load()
2: Dim a As New Class1
3: a = "Hello!"
4: Debug.Print a
5: a.test1 = "World!"
6: Debug.Print a.test1
7: End Sub
|
|
既定のプロパティとして設定したプロパティtest1を使用したVB 6のサンプル・プログラム26 |
これを実行すると以下のようになる。
では、これに相当するプログラムがVB.NETで書けるだろうか。答えは「書けない」である。VB.NETには、既定のプロパティやメソッドは存在しないのである(なお、例外的に、引数のあるプロパティを既定のプロパティとして指定することはできる。これについては、この連載の次回以降で取り上げる)。
なるべくこれに近いサンプル・プログラムを書いてみよう。まずクラス・モジュールから。
1: Public Class Class1
2: Private str As String
3:
4: Public Property test1() As String
5: Get
6: Return str
7: End Get
8: Set(ByVal Value As String)
9: str = Value
10: End Set
11: End Property
12: End Class
|
|
サンプル・プログラム25をVB.NETで書き換えたサンプル・プログラム27 |
これを呼び出すプログラムは以下のようになる。Class1型変数への代入はエラーになるので、プロパティ名は明示的に書き込まねばならない。だが、Trace.WriteLineメソッドに渡す場合、Class1型のままでもコンパイル・エラーにはならない。これは、そのまま残してみよう。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim a As New Class1()
3: a.test1 = "Hello!"
4: Trace.WriteLine(a)
5: a.test1 = "World!"
6: Trace.WriteLine(a.test1)
7: End Sub
|
|
サンプル・プログラム27のプロパティを使用したサンプル・プログラム28 |
これを実行すると、以下のようになる。
1: Sample002o2.Class1
2: World!
|
|
サンプル・プログラム28の実行結果 |
見てのとおり、4行目のTrace.WriteLine(a)は、まったく無関係の文字列が出力されており、似ても似つかない。この文字列は名前空間を含むクラスのフルネームである。クラスは、特に設定しない限り、Trace.WriteLineメソッドの引数に渡されると、フルネームを出力する。
さて、このとき出力される文字列は、ある方法でカスタマイズできる。つまり、非常に限定された状況でのみ、既定のプロパティがあるかのように振る舞わせることができる。以下はそれを実際に試してみた例である。
そのためには、クラス・モジュールにToStringというメソッドを追加する。
1: Public Class Class1
2: Private str As String
3:
4: Public Property test1() As String
5: Get
6: Return str
7: End Get
8: Set(ByVal Value As String)
9: str = Value
10: End Set
11: End Property
12:
13: Public Overrides Function ToString() As String
14: ToString = str
15: End Function
16: End Class
|
|
既定のプロパティがあるかのように振る舞わせたVB.NETのサンプル・プログラム29 |
呼び出す側のコードの変更はない。
これを実行すると以下のようになる。
ここでポイントになるのは、ToStringメソッドである。コード13行目を見て分かるとおり、Overridesキーワードを使って、ToStringメソッドの内容を入れ替えている。だが、このコードにToStringメソッドは1回しか出現しない。内容を入れ替えるなら2回以上ToStringメソッドの定義がなければならないし、さらに使われているのなら、コードのどこかにToStringメソッドの呼び出しがなければならない。これはどうしたことだろうか?
まず、すべてのクラスは暗黙的にSystem.Objectというクラスを継承しているという事実がある。そして、System.Objectには、ToStringというメソッドが含まれている。このメソッドを置き換えるコードが、このコードの13〜15行目というわけである。そして、第2のポイントは、Trace.WriteLineメソッドは、引数の値を出力可能な文字列に変換するために、このToStringメソッドを呼び出すことである。つまり、クラスのToStringメソッドを記述すれば、Trace.WriteLineメソッドで出力される内容を自由にコントロール可能というわけである。そのほか、ToStringメソッドは、あらゆるオブジェクトを文字列に変換するために利用される定番のメソッドであるため、これを実装しておく価値は大きい。
次回予告
次回はプロシージャとメソッド宣言などの機能を取り上げたいと考えている。
Insider.NET 記事ランキング
本日
月間