関数のオーバーロード

 クラスを定義するときに、同じような処理を複数定義したいという場合があります。例えば、2つのデータを比較して、その結果を返すメソッドを定義するとしましょう。その時に、整数値を比較して整数値を返す処理と、実数値を比較して実数値を返す処理を定義することとなりました。C言語でこのような状況で定義しようとすると2つの名前の関数を用意する必要があります。

例:

【整数を比較する関数】
Function int_max(int num1, int num2) AS Integer
End Function
【実数を比較する関数】
Function double_max(double num1, double num2) AS Double
End Function

 VBでは、同じ名前の処理を複数定義することができます。これをオーバーロード(overload)と呼びます。ただし、引数の構成を変える必要があります。引数の構成は次の点を考慮に入れて違う構成の引数を定義します。

○ プロジェクト

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

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

サンプルダウンロード

○ 作成の準備

 「CapsuleTest」プロジェクトを修正して作成しましょう。CapsuleTestフォルダーをコピーして、作成するプロジェクト名にフォルダー名を変更してください。

○ プログラム

 Carクラスにガソリンを給油するメソッドを定義しましょう。次のようにプログラムを追加してください。

Car.vb

  1. Public Class Car
  2.  'フィールド==========
  3.  'Public _speed As Integer 'スピード情報
  4.  Private _speed As Integer 'スピード情報(修正)
  5.  'Public _gas As Double 'ガソリン情報
  6.  Private _gas As Double 'ガソリン情報(修正)
  1.  'ガソリン量を取得する
  2.  Public Function GetGas() As Double
  3.   Return Me._gas
  4.  End Function
  5.  'ガソリンを給油するメソッド
  6.  Public Sub SetGas()
  7.   'オーバーロードしているメソッドを呼び出す
  8.   Me.SetGas(20)
  9.  End Sub
  10.  Public Sub SetGas(gas As Double)
  11.   '止まっている場合は指定したガソリン量を給油
  12.   If Me._speed = 0 Then
  13.    Me._gas += gas
  14.   End If
  15.  End Sub
  16. End Class

○ クラス図

○ 解説

 50~53行目で給油するメソッドを定義しています。仮引数は指定していません。52行目では55行目から定義しているメソッドを呼び出しています。その際に規定値として20を実引数として指定しています。

 55~60行目では給油するメソッドを定義しています。このメソッドではDouble型の仮引数を一つ指定しています。引数にガソリン量を指定すると、その分ガソリン量を増やします。ただし、ガソリン量を増やすのは車が停止しているときです。

○ プログラム

 では、Carオブジェクトを生成して利用しているプログラムも修正しましょう。給油のメニューを追加します。

Module1.vb

  1. Module Module1
  2.  '車の状態を表示するメソッド
  3.  Sub ShowData(c As Car)
  4.   'Console.WriteLine("スピード:{0}km", c._speed)
  5.   Console.WriteLine("スピード:{0}km", c.GetSpeed())
  6.   'Console.WriteLine("ガソリン:{0}L", c._gas)
  7.   Console.WriteLine("ガソリン:{0}L", c.GetGas())
  8.  End Sub
  9.  Sub Main()
  10.   'インスタンスを生成する
  11.   Dim obj As New Car()
  12.   'フィールド変数を初期化する
  13.   'obj._speed = 0
  14.   'obj._gas = 20.0
  15.   obj.Init(20)
  16.   '現在の状態を表示する
  17.   ShowData(obj)
  18.   While True
  19.    '操作を入力
  20.    Console.Write("1)加速 2)減速 3)給油 9)終了:")
  21.    Dim inputdata As String = Console.ReadLine()
  22.    '操作によって分岐する
  23.    Select Case inputdata
  24.     Case "1"
  25.      '加速する
  26.      obj.SpeedUp(5)
  27.      ShowData(obj)
  28.     Case "2"
  29.      '減速する
  30.      obj.SpeedDown(5)
  31.      ShowData(obj)
  32.     Case "3"
  33.      '給油する
  34.      obj.SetGas(35)
  35.      ShowData(obj)
  36.     Case "9"
  37.      'プログラムを終了する
  38.      Return
  39.     End Select
  40.   End While
  41.  End Sub
  42. End Module

○ 解説

 25行目のメニュー表示に給油のメニューを追加しました。38~41行目ではメニューで給油を選択した時の処理を記述しています。今回は35リッターを指定して給油していますが、引数を指定しない場合は20リッター給油されます。

前へ   次へ