今まで作成したCarクラスは、オブジェクトを生成後に初期化して使用してもらいました。もし、初期化せずに使用するとどうなるのでしょうか?ガソリンが0リッターなので、加速しても走りません。Carクラスには初期化メソッドが用意されており、Carクラスを利用する側が呼び出しの記述をしないと初期化されません。そこで、オブジェクトを生成した時に初期化をするように調整しましょう。そのようなときに利用できる仕組みが「コンストラクタ」です。
コンストラクタは、クラスからインスタンス生成をする際にフィールド変数に値を設定するなどの初期設定を行う機能です。インスタンス生成を行う際に呼び出される特別なメソッドを記述します。
コンストラクタ定義の書式 |
---|
アクセス修飾子 クラス名(仮引数リスト) { フィールドの初期化処理など } |
○ プロジェクト
プロジェクトを作成して確認してみましょう。
プロジェクトの種類 | コンソール アプリケーション |
---|---|
プロジェクト名 | ConstractorTest |
○ 作成の準備
Carクラスにコンストラクタの記述を追加しましょう。「OverloadTest」をコピーしてプロジェクトを作成してください。
○ プログラム
次のように記述を追加・修正してください。
Car.cs
○ クラス図
○ 解説
16~18行目でコンストラクタを定義しています。このコンストラクタは引数を受け取らず、呼び出されたらもう一つの引数を受け取るコンストラクタにガソリン量を表す「20」を渡して呼び出しています。
20~24行目では引数を受け付けるコンストラクタを定義しています。スピード情報に「0」をセットし、ガソリン量を引数で受け取ったデータでセットします。
56~61行目では、コンストラクタを定義することにより初期化を行うメソッドが不要になりましたので、コメントアウト(削除)しています。
○ プログラム
コンストラクタが用意されたので、インスタンスを生成する記述も変更しましょう。
Program.cs
○ 解説
24行目で、フィールドを初期化するメソッドの呼び出しは廃止されたため、コメントアウトして実行させないようにしました。その代わりに用意されたコンストラクタで初期化をするために21行目では、インスタンス生成時の引数にガソリン量のデータを渡しています。
前節まではコンストラクタを定義していませんでした。しかし、インスタンス生成時に「new Car()」としていました。コンストラクタを定義していない場合は、引数なし・処理なしのコンストラクタが仮定されて、インスタンスが生成されます。なお、引数を持たないコンストラクタのことを「デフォルトコンストラクタ」と呼びます。
今回のように引数を持つコンストラクタが1つでも定義されている場合は、デフォルトコンストラクタは仮定されません。デフォルトコンストラクタを使用したい場合は引数を持たないコンストラクタを明示的に定義しなくてはなりません。
なお、コンストラクタもオーバーロードさせることができます。コンストラクタ内で同じクラスにある別のコンストラクタを呼ぶ場合は「Car.cs」の16行目にあるように、コンストラクタの定義の後に「 : this()」のように記述をします。