連載

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

第10回 オブジェクト関連(後編)

(株)ピーデー
川俣 晶
2002/06/22

Page1 Page2 Page3 Page4

既定のプロパティ

 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

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

 1: Hello!
 2: World!
サンプル・プログラム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

 呼び出す側のコードの変更はない。

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

 1: Hello!
 2: World!
サンプル・プログラム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メソッドは、あらゆるオブジェクトを文字列に変換するために利用される定番のメソッドであるため、これを実装しておく価値は大きい。

次回予告

 次回はプロシージャとメソッド宣言などの機能を取り上げたいと考えている。End of Article


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第10回 オブジェクト関連(後編)
    1.Inheritsキーワードによる継承機能
    2.インスタンスを作成せずに呼び出せるメソッド
    3.中身のないメソッドに対し、継承により中身を入れる
  4.既定のプロパティ
 
「プロフェッショナル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 記事ランキング

本日 月間