抽象クラス

 ポリモーフィズムを実現させるにはいくつかの方法があります。ここでは、抽象クラスについてみてみましょう。抽象クラスは、抽象メソッドを含むクラスです。抽象メソッドとは、処理を定義していないメソッド、つまり、メソッド名、引数リスト、戻り値の型のみ宣言されているメソッドです。抽象メソッドは「abstract」キーワードをつけて宣言します。

抽象メソッド定義の書式
abstract 戻り値の型 メソッド名(引数リスト);

 抽象メソッドと同様に、抽象プロパティも定義できます。

抽象プロパティ定義の書式
abstract データ型 プロパティ名{
 get;
 set;
}

 抽象メソッドを持つクラスは具現化しないと使えないため、クラスに「abstract」キーワードをつける必要があります。それにより、抽象クラスとします。

抽象クラス定義の書式
abstract class クラス名
{
 各種定義…
}

 抽象クラスはインスタンスを生成できません。別のクラスで継承し、抽象メソッドをオーバーライドして利用することができるようになります。

○ プロジェクト

 プロジェクトを作成して確認してみましょう。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 AbstructClassTest

サンプルダウンロード

○ プログラム

 抽象クラスを作成しましょう。今回は乗り物を表すクラスを作成します。今まで作成したCarクラスを乗り物(Vehicle)クラスとして、加速処理部分を抽象化したクラスを作成することとします。これにより加速部分はそれぞれの種類の乗り物によって定義することになります。Vehicleクラスを追加して、次のようにプログラムを記述してください。

Vehicle.cs

  1. abstract class Vehicle
  2. {
  3.  //プロパティ==========
  4.  public int Speed{get; protected set;}
  5.  public double Gas{get; set;}
  6.  //コンストラクタ==========
  7.  public Vehicle()
  8.   : this(20)
  9.  {
  10.  }
  11.  public Vehicle(double gas)
  12.  {
  13.   this.Speed = 0;
  14.   this.Gas = gas;
  15.  }
  16.  //メソッド==========
  17.  //加速するメソッド(抽象メソッド)
  18.  public abstract void SpeedUp(int sp);
  19.  //減速するメソッド
  20.  public void SpeedDown(int sp)
  21.  {
  22.   //スピードを減らす
  23.   this.Speed -= sp;
  24.   if (this.Speed < 0) //スピードがマイナスになる場合
  25.   {
  26.    //スピードを0に補正する
  27.    this.Speed = 0;
  28.   }
  29.  }
  30. }

○ クラス図

○ 解説

 29行目では、抽象メソッドを宣言しています。メソッドの仕様は決まっているので、このメソッドを使用するにはオーバーライドして処理を実装する必要があります。抽象メソッドが含まれるために9行目のクラスの宣言に「abstract」キーワードがついており、抽象クラスとして作成しています。

○ プログラム

 次に、乗り物クラスを継承したスポーツカークラスを作成しましょう。

SportsCar.cs

  1. class SportsCar
  2.  : Vehicle
  3. {
  4.  //フィールド==========
  5.  public const int MAXSPEED = 300;  //最大スピード
  6.  public const double MAXFUEL = 60;  //ガソリンタンク容量
  7.  //コンストラクタ==========
  8.  public SportsCar(double gas)
  9.   : base(gas)
  10.  {
  11.   //ガソリン量が容量を超える場合は、最大容量をガソリン量にセットv
  12.   if (this.Gas > MAXFUEL)
  13.   {
  14.    this.Gas = MAXFUEL;
  15.   }
  16.  }
  17.  //メソッド==========
  18.  public override void SpeedUp(int sp)
  19.  {
  20.   //ガソリンを減らす
  21.   this.Gas -= sp / 10.0;
  22.   if (this.Gas < 0) //ガソリンがマイナスになる場合
  23.   {
  24.    //ガソリンを0に補正し、スピードを増やさない
  25.    this.Gas = 0;
  26.   }
  27.   else
  28.   {
  29.    //スピードを増やす
  30.    this.Speed += sp;
  31.    if (this.Speed > MAXSPEED)
  32.    {
  33.     this.Speed = MAXSPEED;
  34.    }
  35.   }
  36.  }
  37. }

○ クラス図

○ 解説

 13行目と14行目では最大スピードと、ガソリンタンク容量を定数として宣言しています。

 17~25行目ではコンストラクタを定義しています。このコンストラクタはガソリン量を受けとって、スーパークラスのコンストラクタを呼び出し、ガソリン量をセットしています。そのあと、ガソリンタンク容量と比較して、セットしたガソリン量が多ければ最大容量をセットするという処理をします。

 28~46行目ではSpeedUpメソッドをオーバーライドしています。抽象クラスを継承すると、抽象メソッドは必ずオーバーライドしなければならないという義務が発生します。今回は加速するときに、消費するガソリン量がない場合は加速しない、最大スピードに達していた場合はそれよりスピードが出ないようにしています。

○ プログラム

 では次にSportsCarクラスを利用するプログラムを作成しましょう。次のように記述してください。

Program.cs

  1. class Program
  2. {
  3.  //車の状態を表示するメソッド
  4.  public static void ShowMater(SportsCar car){
  5.  {
  6.   //コンソールの表示を消す
  7.   Console.Clear();
  8.   //各プロパティの内容を表示する
  9.   Console.WriteLine("スピード:{0}km/h", car.Speed);
  10.   Console.WriteLine("ガソリン:{0}L", car.Gas);
  11.  }
  12.  static void Main(string[] args)
  13.  {
  14.   //インスタンス生成
  15.   SportsCar car = new SportsCar(60);
  16.   //状態を表示
  17.   ShowMater(car);
  18.   while (true)
  19.   {
  20.    //操作を入力
  21.    Console.Write("1)加速 2)減速 9)終了:");
  22.    string inputdata = Console.ReadLine();
  23.    //操作によって分岐する
  24.    switch (inputdata)
  25.    {
  26.     case "1":
  27.      //加速する
  28.      car.SpeedUp(10);
  29.      ShowMater(car);
  30.      break;
  31.     case "2":
  32.      //減速する
  33.      car.SpeedDown(5);
  34.      ShowMater(car);
  35.      break;
  36.     case "9":
  37.      //プログラムを終了する
  38.      return;
  39.     default:
  40.      ShowMater(car);
  41.      break;
  42.    }
  43.   }
  44.  }
  45. }

○ 解説

 41行目では、SportsCarオブジェクトのSpeedUpメソッドを呼び出しています。このメソッドはSportsCarクラスでオーバーライドされています。それにより、SportsCarで定義されているSpeedUpが実行されます。

○ 実行結果

スピード:300km/h
ガソリン:29L
1) 加速 2)減速 9)終了:

前へ   次へ