クラスメンバを隠ぺい、公開する。ボリュームあります。

クラスを作成するときに考えなきゃいけないのは、クラスメンバ(クラスの構成要素)の扱いですね。

では、どのように判断すればよいのでしょうか?

一般的にはフィールド(クラスの属性)などはprivateを、要するに隠ぺいをしてあげれば間違えはないでしょう。

 

とはいっても、なぜ隠ぺいが必要なのでしょうか?

確かにpublic(公開)にしていたほうが、扱いは楽ですね。

ただし、、、、いや、実際に見たほうがよさそうですね。

ここでは猫を表すクラスを作るとしましょう。

とはいっても、クラスについては次回きちんとお話したいので、ここではサラッと流します。(このブログのターゲットは誰なんだ?

class Cat
{
    //猫の体重を表すフィールド
    public double weight;
    //猫の身長
    public double height;
    //走ると100グラム体重が減る
    void run()
    {
        weight -= 0.1;
    }
    //食べると体重が100グラム増える
    void eat()
    {
        weight += 0.1;
    }
}

 雑ですが、これは猫クラスです。

これからをオブジェクト生成して。。。

//CatクラスからTamaオブジェクトを生成・参照するようにする
Cat Tama = new Cat();
//Tamaは3.5Kg
Tama.weight = 3.5;
//Tamaを走らせたので-100グラム→3.4キロ
Tama.run();

 Tamaの情報を入れ込むと、すごく簡単にTamaの実体をプログラム化できましたね。

 

これのどこが問題でしょうか?

 

これを間違えて、

//CatクラスからTamaオブジェクトを生成・参照するようにする
Cat Tama = new Cat();
//Tamaは-3.5Kg
Tama.weight = -3.5;
//Tamaを走らせたので-100グラム→-3.6キロ
Tama.run();

 としてしまうとどうでしょう?

どこがいけないかって?

Tamaちゃんの体重が-3.5kgと指定されてしまっていますね。

これは明らかな人的ミスですが、こんな数値も今のプログラムでは通ってしまいます。

 

では、どのようにすればこれを解決すれば様でしょうか?

        static void Main(string[] args)
        {
            //Tamaをクラスから生成、初期化
            Cat Tama = new Cat();
            //Tamaの体重と身長を代入
            Tama.setWeight(3.5);
            Tama.setHeight(72.7);
            //走ること、食べることを指示
            Tama.run();
            Tama.eat();
            //実行結果の表示
            Console.WriteLine(String.Format("Tamaの体重は{0}Kg、身長は{1}cmです。\n"Tama.getWeight(), Tama.getHeight()));
        }
        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;
            }
        }

 ほぼプログラム全文ですいません。

要するに、クラス側ではフィールドをprivateにしてしまったため、従来の「代入」、「参照」ができなくなってしまったため、publicなメソッドを作ります。

たとえば、身長の例で言えば、値を代入する前にその値が誤っていないかを判定して(上の例でいけば、Tamaの体重や身長がマイナスになっていないかなど)問題がなければそれで確定をするといった内容のメソッドを作成します。

 参照の際も同様、getHeightメソッドを実行時にheightの中身を返すようにしています。

実際にheightやweightに値を入れるときには、メソッドの引数として値を渡します。

 

どうでしょうか?このようにやればミスは減るんじゃないでしょうか?

ほかにも、いろいろなメリットがあるんですが、説明して納得するよりも実際にプログラムを打ってた時に自分で見つけたほうがいいんじゃないかと思います。(説明がいやになったわけではないですよ。)

 

ふう。書き忘れたこともなんかある気がするんですが、、、いいでしょう(適当)

 2000文字越えですよ?今回はこれくらいで許してください(笑)

ではでは~