継承

 継承は、インヘリタンスとも呼ばれます。既に用意されているオブジェクトを基に、機能などを追加して新たなオブジェクトを作ることができる機能です。

 これから、Busクラスを作成してみましょう。バスは、人を乗せて運ぶことができますが、車と同じように進んだり、止まったりすることができます。つまり、Carクラスのような機能を持っています。「バスは車である」ということができます。このような関係を「is-a」の関係といいます(Bus is a Car)。

 このような場合、BusクラスはCarクラスの機能等を引き継いで作成することができます。Carクラスを継承してBusクラスを作ることができます。このようにすることで、Busにしかない属性、機能を記述すればよくなります。つまり、CarクラスとBusクラスの差分を記述するわけです。

 継承において、もとになるクラスをスーパークラスや基底クラスといい、それをもとに新しく作成するクラスをサブクラスや派生クラスといいます。

クラス継承の書式
Class サブクラス名
 Inherits スーパークラス名
 各種定義…
End Class

 継承の指定をした後、スーパークラスにはないフィールドやメソッドを追加や修正する記述をします。

○ プロジェクト

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

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

サンプルダウンロード

○ 作成の準備

 Busクラスを作成しましょう。「PropertyTest」をコピーしてプロジェクトを作成してください。 

○ プログラム

 Busクラスを追加して、次のように記述してください。

Bus.vb

  1. Public Class Bus
  2.  Inherits Car
  3.  'プロパティ==========
  4.  Public Property SalesAmount As Integer '運賃
  5.  Public Property PassengerNumber As Integer '乗客人数
  6.  'コンストラクタ==========
  7.  Public Sub New()
  8.   Me.New(100)
  9.  End Sub
  10.  Public Sub New(gas As Double)
  11.   MyBase.New(gas)
  12.   Me.SalesAmount = 0
  13.   Me.PassengerNumber = 0
  14.  End Sub
  15.  'メソッド==========
  16.  '乗車させるメソッド
  17.  Public Function RideToBus(fare As Integer) As String
  18.   '走行中かどうか
  19.   If Me.Speed <> 0 Then
  20.    Return "停車してください。"
  21.   End If
  22.   '満席かどうか
  23.   If Me.PassengerNumber >= 50 Then
  24.    Return "満席のため、乗車できません。"
  25.   End If
  26.   '料金と、乗車人数を加算
  27.   Me.SalesAmount += fare
  28.   Me.PassengerNumber += 1
  29.   Return Nothing
  30.  End Function
  31.  '降車させるメソッド
  32.  Public Function GetOffBus() As String
  33.   '走行中かどうか
  34.   If Me.Speed <> 0 Then
  35.    Return "停車してください。"
  36.   End If
  37.   '乗客がいるかどうか
  38.   If Me.PassengerNumber = 0 Then
  39.    Return "乗客はいません。"
  40.   End If
  41.   '乗車人数を減算
  42.   Me.PassengerNumber -= 1
  43.   Return Nothing
  44.  End Function
  45. End Class

○ クラス図

○ 解説

 2行目でCarクラスを継承しています。これにより、Carクラスが持っているSpeedUpメソッド、SpeedDownメソッドが使えるようになります。

 4行目のプロパティは売上金額を扱います。乗客が乗車するたびに加算されていきます。5行目のプロパティは現在の乗客数を扱います。今回は50人まで乗せられるようにプログラムで制御しています。

 8~10行目ではコンストラクタを定義しています。このコンストラクタは引数なしで呼ばれると、オーバーロードしているガソリン量を受け取るコンストラクタを呼び出します。12~16行目では、ガソリン量を受け取るコンストラクタを定義しています。13行目はスーパークラスのコンストラクタを呼び出しています。「MyBase」キーワードは、スーパークラスを表します。ここでのMyBaseキーワードはCarクラスを表します。

 20~33行目は乗車するメソッドです。このメソッドは運賃を受け取り、乗車処理をします。その際、バスが走っていたり、乗客数が満員になっていたりすると乗車できないようにしています。いずれにも当てはまらない場合は、受け取った運賃を売上金額プロパティに加算し、乗客数プロパティを1人分増やします。

 36~48行目は降車するメソッドです。バスが走っていたり、乗客がいない場合は降車できないようにしています。いずれにも当てはまらない場合は、乗客数プロパティを1人分減らします。 

○ プログラム

 Busクラスを利用するプログラムを作成しましょう。次のように変更してください。

Module1.vb

  1. Module Module1
  2.  '車の状態を表示するメソッド
  3.  Sub ShowData(c As Bus)
  4.   Console.WriteLine("スピード:{0}km", c.Speed)
  5.   Console.WriteLine("ガソリン:{0}L", c.Gas)
  6.   Console.WriteLine("売上金額:{0}円", c.SalesAmount)
  7.   Console.WriteLine("乗車人数:{0}人", c.PassengerNumber)
  8.  End Sub
  9.  Sub Main()
  10.   'インスタンスを生成する
  11.   Dim obj As New Bus(150)
  12.   '現在の状態を表示する
  13.   ShowData(obj)
  14.   While True
  15.    '操作を入力
  16.    Console.Write("1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:")
  17.    Dim inputdata As String = Console.ReadLine()
  18.    '操作によって分岐する
  19.    Select Case inputdata
  20.     Case "1"
  21.      '加速する
  22.      obj.SpeedUp(5)
  23.      ShowData(obj)
  24.     Case "2"
  25.      '減速する
  26.      obj.SpeedDown(5)
  27.      ShowData(obj)
  28.     Case "3"
  29.      '給油する
  30.      'obj.SetGas(35)
  31.      obj.Gas = 80
  32.      ShowData(obj)
  33.     Case "7"
  34.      '乗車する
  35.      Dim retride As String = obj.RideToBus(200)
  36.      If retride Is Nothing Then
  37.       ShowData(obj)
  38.      Else
  39.       Console.WriteLine(retride)
  40.      End If
  41.     Case "8"
  42.      Dim retgetoff As String = obj.GetOffBus()
  43.      If retgetoff Is Nothing Then
  44.       ShowData(obj)
  45.      Else
  46.       Console.WriteLine(retgetoff)
  47.      End If
  48.     Case "9"
  49.      'プログラムを終了する
  50.      Return
  51.    End Select
  52.   End While
  53.  End Sub
  54. End Module

○ 解説

 13行目でBusオブジェクトを生成しています。BusオブジェクトはCarクラスを継承しているので今まで通り加速したり、減速したりできます。40行目では乗車メソッドを呼び出しています。戻り値がNothingでない場合はエラーメッセージが返って来ているので、コンソールに表示しています。47行目では降車メソッドを呼び出しています。このメソッドは乗車メソッドと同様にエラーメッセージかNothingが返ってくるのでそれに応じた処理をしています。

 今回はCarクラスを基にBusクラスを作成しました。BusクラスはCarクラスを継承しているので、Carクラスのメンバを記述しなくても使用することができます。ただし、Privateになっているメンバは、継承したクラスでも直接アクセスすることができません。「Protected」にすれば、直接操作できます。「Protected」は、継承関係であればアクセスできますが、外部クラスからはアクセスすることができません。

 VBでは、サブクラスは1つのクラスから継承することができます。複数のクラスから継承させることはできません。(多重継承の禁止)

Busクラスのイメージ
Busクラスのイメージ

 Busクラスのインスタンスを生成するときにBusクラスのコンストラクタを呼び出します。すると、初めにスーパークラスであるCarクラスのコンストラクタを呼び出します。サブクラスのコンストラクタでスーパークラスのコンストラクタの呼び出しが特に記述されていない場合、スーパークラスのデフォルトコンストラクタが呼び出されます。もし、スーパークラスで引数を持つコンストラクタが定義されていると、デフォルトコンストラクタは仮定されないので、サブクラスでスーパークラスのコンストラクタの呼び出しを記述しなければなりません。

インスタンス生成の手順
インスタンス生成の手順

前へ   次へ