次の方法で共有


クラスへのプロパティの追加

更新 : 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 つのプロパティを追加します。

やってみよう

プロパティをクラスに追加するには

  1. 前のレッスンで作成した Persons プロジェクトを開きます。プロジェクトを保存しなかった場合は、まず前のレッスン「現実世界のオブジェクトのモデリング : 初めてのクラスの作成」に戻って、そのレッスンの手順を完了する必要があります。

  2. ソリューション エクスプローラの Persons.vb をクリックし、[表示] メニューの [コード] をクリックします。

  3. Public Class Persons 行の下に次の宣言コードを追加します。

    Private firstNameValue As String
    Private middleNameValue As String
    Private lastNameValue As String
    Public Married As Boolean
    
  4. 宣言コードの下に次のプロパティ プロシージャを追加します。

    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
    
  5. [ファイル] メニューの [すべてを保存] をクリックして作業を保存します。

読み取り専用プロパティと書き込み専用プロパティ

プロパティは、一度設定されると、プログラムの実行中に変更できないようになっている場合もあります。たとえば、従業員番号を表すプロパティは変更できないため、別のプログラムで読み取ることはできますが、そのプログラムで値を変更することはできません。

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 プロパティをクラスに追加するには

  1. クラス モジュールの上部にあるその他の宣言の下に、次の宣言コードを追加します。

    Private birthYearValue As Integer
    
  2. 宣言コードの下に次のプロパティ プロシージャを追加します。

    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
    
  3. [ファイル] メニューの [すべてを保存] をクリックして作業を保存します。

次の手順

このレッスンでは、プロパティと、プロパティをクラスに追加するさまざまな方法について説明しました。次のレッスンでは、メソッドをクラスに追加してアクションを実行できるようにする方法について説明します。

次のレッスン : 「クラスへのメソッドの追加

参照

処理手順

現実世界のオブジェクトのモデリング : 初めてのクラスの作成

概念

プロパティ プロシージャとフィールド

その他の技術情報

オブジェクトによるプログラミング : クラスを使用する