抽象クラス

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

抽象メソッド定義の書式
アクセス修飾子 MustOverride Sub メソッド名(引数リスト)

アクセス修飾子 MustOverride Function メソッド名(引数リスト) As 戻り値の型

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

抽象クラス定義の書式
アクセス修飾子 MustInherit Class クラス名
 各種定義…
End Class

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

○ プロジェクト

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

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

サンプルダウンロード

○ プログラム

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

Vehicle.vb

  1. Public MustInherit Class Vehicle
  2.  'プロパティ==========
  3.  Public Property Speed As Integer
  4.  Public Property Gas As Double
  5.  'コンストラクタ==========
  6.  Public Sub New()
  7.   Me.New(20)
  8.  End Sub
  9.  Public Sub New(gas As Double)
  10.   Me.Speed = 0
  11.   Me.Gas = gas
  12.  End Sub
  13.  'メソッド==========
  14.  '加速するメソッド(抽象メソッド)
  15.  Public MustOverride Sub SpeedUp(sp As Integer)
  16.  '減速するメソッド
  17.  Public Sub SpeedDown(sp As Integer)
  18.   'スピードを減らす
  19.   Me.Speed -= sp
  20.   If Me.Speed < 0 Then 'スピードがマイナスになる場合
  21.    'スピードを0に補正する
  22.   Me.Speed = 0
  23.   End If
  24.  End Sub
  25. End Class

○ クラス図

○ 解説

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

○ プログラム

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

SportsCar.vb

  1. Public Class SportsCar
  2.  Inherits Vehicle
  3.  'フィールド==========
  4.  Public Const MAXSPEED As Integer = 300     '最大スピード
  5.  Public Const MAXFUEL As Double = 60     'ガソリンタンク容量
  6.  'コンストラクタ==========
  7.  Public Sub New(gas As Double)
  8.   MyBase.New(gas)
  9.   'ガソリン量が容量を超える場合は、最大容量をガソリン量にセット
  10.   If Me.Gas > MAXFUEL Then
  11.    Me.Gas = MAXFUEL
  12.   End If
  13.  End Sub
  14.  'メソッド==========
  15.  Public Overrides Sub SpeedUp(sp As Integer)
  16.   'ガソリンを減らす
  17.   Me.Gas -= sp / 10.0
  18.   If Me.Gas < 0 Then 'ガソリンがマイナスになる場合
  19.    'ガソリンを0に補正し、スピードを増やさない
  20.    Me.Gas = 0
  21.   Else
  22.    'スピードを増やす
  23.    Me.Speed += sp
  24.    If Me.Speed > MAXSPEED Then     '最大スピードに達した場合
  25.      '最大スピードをセットする
  26.      Me.Speed = MAXSPEED
  27.     End If
  28.   End If
  29.  End Sub
  30. End Class

○ クラス図

○ 解説

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

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

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

○ プログラム

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

Module1.vb

  1. Module Module1
  2.  '車の状態を表示するメソッド
  3.  Public Sub ShowMeter(car As SportsCar)
  4.   'コンソールの表示を消す
  5.   Console.Clear()
  6.   '各プロパティの内容を表示する
  7.   Console.WriteLine("スピード:{0}km/h", car.Speed)
  8.   Console.WriteLine("ガソリン:{0}L", car.Gas)
  9.  End Sub
  10.  Sub Main()
  11.   'インスタンス生成
  12.   Dim car As New SportsCar(60)
  13.   '状態を表示
  14.   ShowMeter(car)
  15.   While True
  16.    '操作を入力
  17.    Console.Write("1)加速 2)減速 9)終了:")
  18.    Dim inputdata As String = Console.ReadLine()
  19.    '操作によって分岐する
  20.    Select Case inputdata
  21.     Case "1"
  22.      '加速する
  23.      car.SpeedUp(10)
  24.      ShowMeter(car)
  25.     Case "2"
  26.      '減速する
  27.      car.SpeedDown(5)
  28.      ShowMeter(car)
  29.     Case "9"
  30.      'プログラムを終了する
  31.      Return
  32.     Case Else
  33.      ShowMeter(car)
  34.    End Select
  35.   End While
  36.  End Sub
  37. End Module

○ 解説

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

○ 実行結果

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

前へ   次へ