ポリモーフィズムを実現させるにはいくつかの方法があります。ここでは、抽象クラスについてみてみましょう。抽象クラスは、抽象メソッドを含むクラスです。抽象メソッドとは、処理を定義していないメソッド、つまり、メソッド名、引数リスト、戻り値の型のみ宣言されているメソッドです。抽象メソッドは「abstract」キーワードをつけて宣言します。
抽象メソッド定義の書式 |
---|
abstract 戻り値の型 メソッド名(引数リスト); |
抽象メソッドと同様に、抽象プロパティも定義できます。
抽象プロパティ定義の書式 |
---|
abstract データ型 プロパティ名{ get; set; } |
抽象メソッドを持つクラスは具現化しないと使えないため、クラスに「abstract」キーワードをつける必要があります。それにより、抽象クラスとします。
抽象クラス定義の書式 |
---|
abstract class クラス名 { 各種定義… } |
抽象クラスはインスタンスを生成できません。別のクラスで継承し、抽象メソッドをオーバーライドして利用することができるようになります。
○ プロジェクト
プロジェクトを作成して確認してみましょう。
プロジェクトの種類 | コンソール アプリケーション |
---|---|
プロジェクト名 | AbstructClassTest |
○ プログラム
抽象クラスを作成しましょう。今回は乗り物を表すクラスを作成します。今まで作成したCarクラスを乗り物(Vehicle)クラスとして、加速処理部分を抽象化したクラスを作成することとします。これにより加速部分はそれぞれの種類の乗り物によって定義することになります。Vehicleクラスを追加して、次のようにプログラムを記述してください。
Vehicle.cs
○ クラス図
○ 解説
29行目では、抽象メソッドを宣言しています。メソッドの仕様は決まっているので、このメソッドを使用するにはオーバーライドして処理を実装する必要があります。抽象メソッドが含まれるために9行目のクラスの宣言に「abstract」キーワードがついており、抽象クラスとして作成しています。
○ プログラム
次に、乗り物クラスを継承したスポーツカークラスを作成しましょう。
SportsCar.cs
○ クラス図
○ 解説
13行目と14行目では最大スピードと、ガソリンタンク容量を定数として宣言しています。
17~25行目ではコンストラクタを定義しています。このコンストラクタはガソリン量を受けとって、スーパークラスのコンストラクタを呼び出し、ガソリン量をセットしています。そのあと、ガソリンタンク容量と比較して、セットしたガソリン量が多ければ最大容量をセットするという処理をします。
28~46行目ではSpeedUpメソッドをオーバーライドしています。抽象クラスを継承すると、抽象メソッドは必ずオーバーライドしなければならないという義務が発生します。今回は加速するときに、消費するガソリン量がない場合は加速しない、最大スピードに達していた場合はそれよりスピードが出ないようにしています。
○ プログラム
では次にSportsCarクラスを利用するプログラムを作成しましょう。次のように記述してください。
Program.cs
○ 解説
41行目では、SportsCarオブジェクトのSpeedUpメソッドを呼び出しています。このメソッドはSportsCarクラスでオーバーライドされています。それにより、SportsCarで定義されているSpeedUpが実行されます。
○ 実行結果
スピード:300km/h
ガソリン:29L
1) 加速 2)減速 9)終了: