header

■クラス class

クラスとは大雑把に言うと
データと、それを処理するメソッドが集まったものです。

処理(関数)は必ずクラスのメンバーとして記述されるので
クラスの存在は必要不可欠です。

では例として生徒1人分のデータを保持し
それを処理するクラスのサンプルコードを書いてみます。

【クラスの例】
    class Student
    {
        // メンバ変数
        private string name;    // 名前
        private int height;     // 身長

        // メンバ関数
        public void Put()
        {
            Console.WriteLine("名前={0} 身長={1}", name, height );
        }
    }

【実行結果】
    名前=yamada 身長=160
    
名前を保持するstring型と 身長を保持するint型をメンバーとして持ち、 名前と身長を出力する Put関数 を持っているクラスの例です。
アクセス修飾子 private, public
メンバ変数やメンバ関数の頭に private、public、といった修飾子が付いています。 publicと修飾されたメンバは、 クラスの外から参照可能です。 逆にprivateと修飾されたメンバは、 そのクラス内でのみ参照可能となります。
【アクセス修飾子を理解するためのサンプルコード】
    using System;

    namespace Sample
    {
        class Student
        {
            // メンバ変数
            private string name;    // 名前
            private int height;     // 身長

            // メンバ関数
            public void Put()
            {
                Console.WriteLine("名前={0} 身長={1}", name, height );
            }
        }

        class Class1
        {
            static void Main(string[] args)
            {
                Student yamada = new Student();

                // privateなメンバであるnameの値をクラス外から変更できません
                // yamada.name = "yamada";

                // publicなメンバであるPut関数を呼び出すことは可能です
                yamada.Put();
            }
        }
    }

【実行結果】
    名前= 身長=0
    
名前と身長を格納していないので このような実行結果となります。 初期化していないクラスのメンバ変数には それぞれの型の既定値が入ります。
コンストラクタ デフォルト〜, ユーザ定義の〜
上記クラスは、そのままでは役に立ちません。 名前や身長といったメンバはprivateなので クラスを利用する側で値を設定することができないからです。 ではなぜprivateなのかについては言わずもがなですが せっかくクラス内にカプセル化したものをpublicとして公開すると 外部から好き勝手に内容を変更されてしまうためです。 そこで、メンバに初期値を設定する手段として コンストラクタを用意して 名前や身長の初期値を設定できるようにしてみます。 コンストラクタとは クラスのインスタンスを生成したときに 最初に実行される特殊なメンバ関数のことです。
【デフォルトコンストラクタを持ったクラスのサンプルコード】
    using System;

    namespace Sample
    {
        class Student
        {
            // メンバ変数
            private string name;    // 名前
            private int height;     // 身長

            // メンバ関数
            public void Put()
            {
                Console.WriteLine("名前={0} 身長={1}", name, height );
            }
            // デフォルトコンストラクタ
            public Student()
            {
                name = "yamada";
                height = 160;
            }
        }

        class Class1
        {
            static void Main(string[] args)
            {
                Student stu = new Student();

                stu.Put();
            }
        }
    }

【実行結果】
    名前=yamada 身長=160
    
これで、名前と身長の初期値が設定され、出力もできました。 Studentクラスのインスタンスを作ると 名前と身長の初期値がコンストラクタで設定されます。 【補足】 コンストラクタの修飾子はpublicと宣言します。 そうしないと、外部から呼び出せないからです。 仮にこれをprivateとしてもクラスを定義することはできますが クラスのインスタンスを作成できません。 コンストラクタがprivateでは それを呼び出すことができないからです。 デフォルトコンストラクタはパラメータを持ちません。 そのため、このままでは クラスのインスタンスを作成する側から 名前や身長といったメンバ変数に 任意の初期値を与えることができません。 これを解決するのが パラメータを持ったユーザ定義のコンストラクタです。
【ユーザ定義のパラメータを持つコンストラクタのサンプルコード】
    using System;

    namespace Sample
    {
        class Student
        {
            // メンバ変数
            private string name;    // 名前
            private int height;     // 身長

            // メンバ関数
            public void Put()
            {
                Console.WriteLine("名前={0} 身長={1}", name, height );
            }
            // ユーザ定義の引数を持つコンストラクタ
            public Student(string n, int h)
            {
                name   = n;
                height = h;
            }
        }

        class Class1
        {
            static void Main(string[] args)
            {
                // コンストラクタに引数で初期値を与えています。
                Student stu = new Student("yamata", 160);

                stu.Put();
            }
        }
    }

【実行結果】
    名前=yamada 身長=160
    
コンストラクタが引数を持つところに注目してください。 newでStudentクラスのインスタンスを作る時に コンストラクタに名前と身長の初期値をパラメータとして与えています。




Copyright © 2008.07 - shougo suzaki