佐々木屋

技術的なことから趣味まで色々書きます

クラスのプロパティ①(基本)

クラスのプロパティはオブジェクト指向プログラミングの中でも非常に有用で、クラス構築ではなくてはならない存在です。オブジェクト指向プログラミングの話でよく出てくる「隠蔽」を実現することができます。VB6出身であれば分かりますが、所謂Public変数を抑制できるのです。なお、Public変数は完全なる悪ですので、これありきで実装しているなら今すぐ改善しましょう。

プロパティはクラス内のメンバーを外側から隠蔽する働きがありますが、クラス内部から見ると単なる変数として扱えるという点も魅力的です。

プロパティ実装の基本

プロパティ実装の基本です。プロパティはgetアクセサ(getter)、setアクセサ(setter)の2つから構成されます。その名の通り、getアクセサはメンバーの値を外部へ提供する機能(読み取り)、setアクセサはメンバーに値を外部から設定する機能(書き込み)です。

private string _hoge;
public string Hoge {
    get {
        return _hoge;
    }
    set {
        _hoge = value;
    }
}
Private _hoge As String
Public Property Hoge() As String
    Get
        Return _hoge
    End Get
    Set(ByVal value As String)
        _hoge = value
    End Set
End Property

valueという変数が勝手に作成されて、これが橋渡しの機能を担います。

なお、プロパティは変数と用途を分ける為、名前の最初を大文字で記載します。


保守性の向上

メンバー変数だけの場合は値を入れる事しかできませんので、もし保持させる値で何か制御が必要な場合を考えたとき、呼び出し元でその振る舞いを書くか、別途メソッドを追加する必要があります。でもプロパティであれば、setアクセサにそのまま実装することができるので、コードの保守性は一気に向上します。

例えば、「文字列を4文字上限にしてそれ以上は切り捨てて保持させたい」という条件であれば以下の通りです。

private string _hoge;
public string Hoge {
    get {
        return _hoge;
    }
    set {
        _hoge = value.Length > 4 ? value.Substring(0, 4) : value;
    }
}
Private _hoge As String
Public Property Hoge() As String
    Get
        Return _hoge
    End Get
    Set(ByVal value As String)
        _hoge = If(value.Length > 4, value.Substring(0, 4), value)
    End Set
End Property

この他に自動実装プロパティやアクセスレベルの設定が可能です。