関数のオーバーロード

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

例:

 【整数を比較する関数】
  int int_max(int num1, int num2){
  }
 【実数を比較する関数】
  double double_max(double num1, double num2){
  }

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

○ プロジェクト

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

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

サンプルダウンロード

○ 作成の準備

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

○ プログラム

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

Car.cs

  1. class Car
  2. {
  3.  //フィールド==========
  4.  private int speed;  //スピード
  5.  private double gas;  //ガソリン情報
  1.  //ガソリンを給油するメソッド
  2.  public void SetGas()
  3.  {
  4.   //オーバーロードしているメソッドを呼び出す
  5.   this.SetGas(20);
  6.  }
  7.  public void SetGas(double gas)
  8.  {
  9.   //止まっている場合は指定したガソリン量を給油
  10.   if (this.speed == 0)
  11.   {
  12.    this.gas += gas;
  13.   }
  14.  }
  15. }

○ クラス図

○ 解説

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

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

○ プログラム

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

Program.cs

  1. class Program
  2. {
  3.  //車の状態を表示するメソッド
  4.  static void ShowData(Car car)
  5.  {
  6.   Console.WriteLine("スピード:{0}km", car.GetSpeed());
  7.   Console.WriteLine("ガソリン:{0}L", car.GetGas());
  8.  }
  9.   
  10.  static void Main(string[] args)
  11.  {
  12.   //インスタンスを生成する
  13.   Car car = new Car();
  14.   //フィールド変数を初期化する
  15.   car.Init(20);
  16.   //現在の状態を表示する
  17.   ShowData(car);
  18.   while (true)
  19.   {
  20.    //操作を入力
  21.    Console.Write("1)加速 2)減速 3)給油 9)終了:");
  22.    string inputdata = Console.ReadLine();
  23.    //操作によって分岐する
  24.    switch (inputdata)
  25.    {
  26.     case "1":
  27.      //加速する
  28.     car.SpeedUp(5);
  29.      ShowData(car);
  30.      break;
  31.     case "2":
  32.      //減速する
  33.      car.SpeedDown(5);
  34.      ShowData(car);
  35.      break;
  36.     case "3":
  37.      //給油する
  38.      car.SetGas(35);
  39.      ShowData(car);
  40.      break;
  41.     case "9":
  42.      //プログラムを終了する
  43.      return;
  44.    }
  45.   }
  46.  }
  47. }

○ 解説

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

前へ   次へ