VC#では、クラスの中にプロパティを定義することができます。このプロパティは、クラス作成者の側から見ると、メソッドのように記述をします。クラス利用者の側から見ると、フィールドのように利用できます。
プロパティ定義の書式 |
---|
アクセス修飾子 データ型 プロパティ名 { set { フィールド設定の記述 } get { フィールド取得の記述 } } |
プロパティではsetアクセサーとgetアクセサーを指定します。setアクセサーは値を設定することができます。その際、valueキーワードに設定する値が渡されるので、そのキーワードを使って処理を記述します。setアクセサーのみ定義すると設定のみできるプロパティ、getアクセサーのみ定義すると参照のみできるプロパティ、両方とも指定すると参照・設定できるプロパティとなります。
○ プロジェクト
プロジェクトを作成して確認してみましょう。
プロジェクトの種類 | コンソール アプリケーション |
---|---|
プロジェクト名 | PropertyTest |
○ 作成の準備
Carクラスにプロパティを追加しましょう。「ConstractorTest」をコピーしてプロジェクトを作成してください。
○ プログラム
次のように記述を追加・修正してください。
Car.cs
○ クラス図
○ 解説
17~23行目では、スピード参照用のプロパティを定義しています。利用するプログラム側で「オブジェクト変数名.Speed」と記述することにより、getアクセサーで記述されている処理を実行します。今回は、speedフィールド変数の内容を返します。
26~40行目では、ガソリン量の参照・設定用のプロパティを定義しています。利用するプログラム側で「オブジェクト変数名.Gas」と記述することにより、getアクセサーで記述されている処理を実行します。今回は、gasフィールド変数の内容を返します。また利用するプログラム側で「オブジェクト変数名.Gas = 30.5」と記述することにより、setアクセサーで記述されている処理を実行します。代入されたデータはvalueキーワードで扱えるので、車が止まっている場合はgasフィールド変数に設定するガソリン量を加算します。
スピード参照、ガソリン量参照・設定のプロパティを用意したので、同じような処理をするメソッドはコメントアウトして廃止しました。
○ プログラム
プロパティが用意されたので、Carクラスを利用する記述も変更しましょう。
Program.cs
○ 解説
14、17、50行目は、メソッドの廃止により使えなくなったのでコメントアウトしました。その代わりに用意されたプロパティを利用するために、15、18行目はプロパティの参照の記述をしています。また、51行目でもメソッドによってガソリン量を設定していましたが、プロパティの代入によってガソリン量を設定する記述を追加しました。
このようにプロパティを追加することにより、Carオブジェクトにとってはメソッドのように動作し、Carクラスを利用するオブジェクトからはフィールドを使うかのように利用することができるようになりました。
また、プロパティを定義することでフィールドの定義を省略することができます。
○ プロジェクト
プロジェクトを作成して確認してみましょう。
プロジェクトの種類 | コンソール アプリケーション |
---|---|
プロジェクト名 | PropertyTest2 |
○ プログラム
Fruitクラスを追加して次のように定義してください。
Fruit.cs
○ クラス図
○ 解説
今回のサンプルでのFruitクラスは、名前と価格の情報を持ち、個数を指定すると価格を元に合計金額を計算するメソッドを定義しています。
12、13行目ではプロパティを定義しています。フィールドは定義していません。このようにプロパティのみ定義することでそれに対応するフィールドは自動的に用意されます。フィールドに対する参照や設定が単純なものは今回のように自動実装のプロパティで用意することができます。
12行目にあるように、アクセサーに対してアクセス修飾子を指定することができます。今回のようにprivateを指定したsetアクセサーは、Fruitクラス内部からは利用できます。つまり、内部のコンストラクタやメソッドからであれば果物名を設定することができます。Fruitクラスを利用するクラスからは参照はできますが、設定はできません。
○ プログラム
Fruitクラスを利用するプログラムを記述してください。
Program.cs
○ 解説
Fruitオブジェクトを生成して利用しています。今回はプログラムの中で指定していませんが、FruitオブジェクトのNameプロパティに代入する記述をするとエラーとなります。
○ 実行結果
合計金額:750円