クラスのプロパティ(アクセサ)の話

ここまで、様々なクラスの書き方を取り上げてきましたが、今回はクラスのプロパティについてやっていこうと思います。

さて、クラスのお話で度々登場するCatクラスですが、よく見てみると非常に腫れぼったく見えませんか?

class Cat
{
    //猫の体重を表すフィールド
    private double weight;
    //猫の身長
    private double height;
    public void setWeight(double dWeight)
    {
        if (0 < dWeight)
        {
            weight = dWeight;
        }
    }
    public void setHeight(double dHeight)
    {
        if (0 < dHeight)
        {
            height = dHeight;
        }
    }
    public double getWeight()
    {
        return weight;
    }
    public double getHeight()
    {
        return height;
    }
    //走ると100グラム体重が減る
    public void run()
    {
        weight -= 0.1;
    }
    //食べると体重が100グラム増える
    public void eat()
    {
        weight += 0.1;
        height += 0.01;
    }
}

はいそうです。毎回フィールドにアクセスする仕様にするたびにメソッドを用意していますよね。

これは後でプログラムを見返すとき、誰かと共同で作業をするときなどに障害になりえません。

これを簡略に書くための方法として用意されているのが、プロパティです。

プロパティを利用するときには、get、setというフィールドを扱うための処理を先に用意しておきます。

この処理をaccessor(アクセサ)といいます。

では、コードに起こしてみるとどうなるでしょうか?

※だんだんとコードが長くなってきたので、weightとheightだけ示します。

//猫の体重を表すフィールド
double weight;
//猫の身長を表すフィールド
double height;
public double Weight
{
    get { return weight; }
    set { if (value > 0)
        weight = value; }
}
public double Height
{
    get { return height; }
    set{
        if (value > 0)
            height = value; }
}

どうでしょうか。これで、作業もはかどりますね。

いちいちget...メソッド、set...メソッドを書かなくても、アクセサであれば短い文で両方実装できますね。

この場合、オブジェクトに起こして実際に値を入れる時は、

Cat Tama = new Cat();
Tama.Weight = 3.5;
Tama.Height = 72.7;

とするだけでOKです。

ちなみに前の時は

Cat Tama = new Cat();
Tama.setWeight(3.5);
Tama.setHeight(72.7);

と書きましたね。

こうやって見てみると、クラスの作り方のとき(フィールドがpublicのとき)に説明した時と同じ書き方で値の設定、取得ができることをお気づきになったでしょうか?

そう考えて見てみると、面白いことが分かりますね。

それは、アクセサは見る視点により、フィールドとメソッドの顔を持っているということです。

たとえば、オブジェクトとして扱うときには、アクセサはまるでpublicなフィールドを扱うかのように振る舞います。

しかし、クラスの実装に着目して言えば、値の正当性(言葉が違うような)などを確認する機能を設ける、いわばメソッドのようです。

ここから、読み取るに(臨機応変に対応すべきだと思いますが)アクセサは非常に強力かつ万能だということをお分かり頂けたと思います。

 

ではでは~