導入
あるクラス「Sample01」の変数aについて
- 読みこみ…クラスの内外から可能
- 書き換え…内部からのみ可能
と読込・書き換えでアクセス範囲を変えたい場合はプロパティというものを用いれば、簡潔に記述することができます。
プロパティのメリット
- 以下の様にそれぞれ関数を実装するより簡潔に記述できる。
- 変数のアクセス範囲が明らかになるので、複数人での作業の場合は重宝しそうできそう。
- 変数に制約を加える場合(0~100の範囲に収める)は変数を書き換えるたびにif分を用いるということが無くなるので便利。
public class Sample01 { int a; public int GetA() { return a; } void SetA(int a) { this.a = a; } }
プロパティを用いるメリット
1. 変数に対して、読み込みと書き込みの範囲を別々に設定できる。
- 変数の読み込みはクラス外部からも可能であるが、書き込みはクラス内部からのみという言うことが容易に実現できるようになる。
- 先ほどのクラス「Sample01」なら以下のように変更できる
public class Sample01 { public int A { get; private set; } }
2. 変数の代入に対して制約を与えられる。
- 変数に対して制約がある場合もプロパティが有効である。
- 例)次のプログラムではhpというint型変数を0~100しか設定できないようにできる。
public class Human { int hp; public int HP { get { return hp; } set { hp = value; if (hp < 0) hp = 0; else if (hp > 100) hp = 100; } } }
使用例
public class MainClass { public static void Main() { Human human = new Human(); human.HP = -2; Console.WriteLine($"-2を代入した場合:Hp= {human.HP}"); human.HP = 15; Console.WriteLine($"15を代入した場合:Hp= {human.HP}"); human.HP = 125; Console.WriteLine($"125を代入した場合:Hp= {human.HP}"); } }
実行結果
-2を代入した場合:Hp= 0 15を代入した場合:Hp= 15 125を代入した場合:Hp= 100
継承
- プロパティは関数と同様に継承することが可能。
- ただし、継承先でアクセス範囲の変更(public⇒privateなど)はできない点に注意。
using System; public abstract class BaseClass { public abstract int A { get; protected set; } } public class SubClass : BaseClass { int _a = 0; public SubClass(int a) { Console.WriteLine($"コンストラクタ"); A = a; } public override int A { get { Console.WriteLine($"Get A = {_a}"); return _a; } protected set { _a = value; Console.WriteLine($"Set A = {_a}"); } } } public class Hello { public static void Main() { SubClass sub = new SubClass(5); Console.WriteLine($"A = {sub.A}"); } }
実行結果
コンストラクタ Set A = 5 Get A = 5 A = 5