更新 : 2007 年 11 月
このレッスンでは、前のレッスンで作成したクラスにプロパティを追加する方法について説明します。
前のレッスン「詳細情報 : プロパティ、メソッド、イベントについて」では、すべてのオブジェクトに属性があり、プロパティは属性を表すことについて説明しました。前のレッスンでは、人を表す Persons クラスを作成しました。人には名前や年齢などの属性があるため、Persons クラスにはそれらの属性を表すプロパティが必要です。
プロパティは、フィールドまたはプロパティ プロシージャのいずれかとしてクラスに追加できます。プロパティの Public、ReadOnly、または WriteOnly の各修飾子を使用して、プロパティの動作を決定することもできます。
フィールドとプロパティ プロシージャ
フィールドは、クラス内の単なるパブリック変数であり、クラスの外部に設定するか、クラスの外部から読み込むことができます。フィールドは、Boolean (True または False) 値など、検証の必要がないプロパティに便利です。Persons クラスの場合、独身か既婚かを指定する Married という名前の Boolean プロパティが考えられます。設定できる値は 2 つしかないため、フィールドはこのプロパティに対して正しく機能します。
フィールドをクラスに追加する場合、コードは次のようになります。
Public Married As Boolean
ただし、ほとんどのプロパティはフィールドよりも複雑です。プロパティをクラスに追加するには、ほとんどの場合、プロパティ プロシージャを使用します。プロパティ プロシージャには、プロパティ値を格納するためのプライベート変数の宣言、値を公開する Get プロシージャ、および値を設定する Set プロシージャの 3 つの部分があります。
たとえば、Persons クラスの Name プロパティのプロパティ プロシージャは、次のようになります。
Private nameValue As String
Public Property Name() As String
Get
Name = nameValue
End Get
Set(ByVal value As String)
nameValue = value
End Set
End Property
最初のコード行は、プロパティの値を格納する String プライベート変数 nameValue を宣言します。プロパティ プロシージャ自体は Public Property で始まり、End Property で終了します。
Get プロシージャには、値を読み取るときに実行されるコードが含まれます。たとえば、Persons.Name プロパティを読み取る場合、コードは nameValue 変数に格納された値を返します。
Set プロシージャには、value 引数として渡される値を使用して、nameValue 変数に新しい値を割り当てるために使用されるコードが含まれます。たとえば、コード Persons.Name = "John" を記述すると、String 値 John が value 引数として渡されます。その後、Set プロシージャのコードは、この値を NameValue 変数に割り当てて格納します。
Name プロパティを表すためにフィールドを使用するのではなく、手間のかかる方法を取るのはなぜでしょうか。実際のシナリオでは、名前に対して特定の規則があります。たとえば、通常は名前には数値は含まれません。Set プロシージャにコードを追加すると、value 引数を確認して、数値が含まれる場合にはエラーを返すことができます。
次のプロシージャでは、Persons クラスに 1 つのフィールドと 3 つのプロパティを追加します。
やってみよう
プロパティをクラスに追加するには
前のレッスンで作成した Persons プロジェクトを開きます。プロジェクトを保存しなかった場合は、まず前のレッスン「現実世界のオブジェクトのモデリング : 初めてのクラスの作成」に戻って、そのレッスンの手順を完了する必要があります。
ソリューション エクスプローラの Persons.vb をクリックし、[表示] メニューの [コード] をクリックします。
Public Class Persons 行の下に次の宣言コードを追加します。
Private firstNameValue As String Private middleNameValue As String Private lastNameValue As String Public Married As Boolean
宣言コードの下に次のプロパティ プロシージャを追加します。
Public Property FirstName() As String Get FirstName = firstNameValue End Get Set(ByVal value As String) firstNameValue = value End Set End Property Public Property MiddleName() As String Get MiddleName = middleNameValue End Get Set(ByVal value As String) middleNameValue = value End Set End Property Public Property LastName() As String Get LastName = lastNameValue End Get Set(ByVal value As String) lastNameValue = value End Set End Property
[ファイル] メニューの [すべてを保存] をクリックして作業を保存します。
読み取り専用プロパティと書き込み専用プロパティ
プロパティは、一度設定されると、プログラムの実行中に変更できないようになっている場合もあります。たとえば、従業員番号を表すプロパティは変更できないため、別のプログラムで読み取ることはできますが、そのプログラムで値を変更することはできません。
ReadOnly キーワードは、プロパティ値が読み取り可能で変更不可であることを指定するために使用されます。ReadOnlyプロパティに値を割り当てようとすると、コード エディタでエラーが発生します。
読み取り専用プロパティを作成するには、次のように Set プロシージャを含めずに Get プロシージャを使用してプロパティ プロシージャを作成します。
Private IDValue As Integer
ReadOnly Property ID() As Integer
Get
ID = IDValue
End Get
End Property
同様に、WriteOnly キーワードは、プロパティ値を設定することはできますが、読み取ることはできません。たとえば、パスワード プロパティを他のプログラムで読み取ることはできません。クラス内で処理を実行する場合にプロパティ値を使用することはできますが、プライベートにしておきます。
書き込み専用プロパティを作成するには、次のように Get プロシージャを含めずに Set プロシージャを使用してプロパティを作成します。
Private passwordValue As String
WriteOnly Property Password() As String
Set(ByVal value As String)
passwordValue = value
End Set
End Property
ReadOnly プロパティ プロシージャおよび WriteOnly プロパティ プロシージャは、あるプロパティ値を取得して別の値に変換する場合にも便利です。たとえば、人の年齢について考えてみましょう。名前とは違い、年齢は時がたつにつれて変わります。年齢をクラスに代入すると、1 年後にそこから読み取ったとき、その値は正しくありません。
Persons クラスでは、誕生年を表す WriteOnlyBirthYear プロパティ (変化しない) と、現在の年と誕生年の差を計算して値を返す ReadOnlyAge プロパティの 2 つのプロパティを追加することでこの問題を回避できます。
やってみよう
ReadOnly プロパティと WriteOnly プロパティをクラスに追加するには
クラス モジュールの上部にあるその他の宣言の下に、次の宣言コードを追加します。
Private birthYearValue As Integer
宣言コードの下に次のプロパティ プロシージャを追加します。
WriteOnly Property BirthYear() As Integer Set(ByVal value As Integer) birthYearValue = value End Set End Property ReadOnly Property Age() As String Get Age = My.Computer.Clock.LocalTime.Year - birthYearValue End Get End Property
[ファイル] メニューの [すべてを保存] をクリックして作業を保存します。
次の手順
このレッスンでは、プロパティと、プロパティをクラスに追加するさまざまな方法について説明しました。次のレッスンでは、メソッドをクラスに追加してアクションを実行できるようにする方法について説明します。
次のレッスン : 「クラスへのメソッドの追加」
参照
処理手順
現実世界のオブジェクトのモデリング : 初めてのクラスの作成