About
Visual C#
統合開発環境ツール:Visual Studio 2008 Professional
データベース:SQL Server 2005 Developer Edition
OS:Windows7 RC

Objective-C
統合開発環境ツール:Xcode3.1.2
OS:Mac OS X v10.5.7 Leopard
  C#   ASP.NET   Link   Contact
         
メソッドのオーバーロード
 
  無料のExpress Editionはこちらから  
 
 

開発環境

統合開発環境:
Visual Studio 2008 Professional
使用OS:
Windows7 RC

 
 

  オーバーロードとは

オーバーロードとは、同じメソッド名でメソッドを実装し、引数の違いよって呼び出すメソッドを決定できる機能の事を言います。例えば、以下のような2つのメソッドがあるとします。この2つのメソッド名は同じですが、シグネチャが異なるためオーバーロードされていることがわかります。
1
2
3
4
5
6
7
8
public void method()
{
   Console.WriteLine("引数は指定されていません");
}
public void method(string str)
{
   Console.Write(String.Format("引数に{0}が指定されました", str));
}

,「method」メソッドを呼び出した際、どちらのメソッドが実行されるかは引数によって決まります。引数が何もなければ1行目のメソッドが実行され、string型の引数が指定されれば5行目のメソッドが実行されます。

このように、C#では同じメソッド名であってもシグネチャが違うメソッドを宣言できるのが特徴です。

では、実際にこのプログラムを実行できる形にしましょう。以下のようにコーディングしてください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         Class obj = new Class();
         obj.method();
         obj.method("文字列");
         Console.ReadLine();
      }
   }
   class Class
   {
      public void method()
      {
         Console.WriteLine("引数は指定されていません");
      }
      public void method(string str)
      {
         Console.Write(String.Format("引数に{0}が指定されました", str));
      }
   }
}

実行結果
1
2
引数は指定されていません
引数に文字列が指定されました

このプログラムでは、20行目と24行目で同じメソッド名でもシグネチャが異なるメソッド「method」を実装しています。12行目ではこのメソッドが実装されている「Class」クラスをインスタンス化し、13行目で引数を指定せずに「method」メソッドを呼び出し、14行目で引数を指定して「method」メソッドを呼び出しています。

実行結果を見てみると、引数の違いによって違うメソッドが呼ばれていることがわかります。このように、メソッドのオーバーライド機能を使えば、引数の違いに応じて違った処理を実装できるのが特徴です。

  コンストラクタをオーバーロードする

コンストラクタをオーバーロードすれば、状況によって違った初期化を定義できるのでとても便利です。例えば、インスタンスに設定するフィールドが確定しているときは引数を設定したコンストラクタを呼び出し、値が不定の場合は既定の初期値を渡してインスタンスを初期化するといったことも可能です。

以下のプログラムは、連絡先を管理するクラスをインスタンス化し、連絡先の各情報が得られている場合には引数を指定したコンストラクタを呼び出して初期化を行います。連絡先の各情報がまだわからない段階でインスタンス化する場合には既定の初期値を指定して初期化するよう実装した例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         Adress adress1 = new Adress("Europaris", "xxx-xxxx-xxxx", "europaris@xxx.xx.xx");
         Adress adress2 = new Adress();
         adress1.show();
         adress2.show();
         Console.ReadLine();
      }
   }
   class Adress
   {
      protected string name; //名前を保持
      protected string tell; //電話番号を保持
      protected string mail; //メールアドレスを保持
      public Adress(string str1, string str2, string str3) //コンストラクタ
      {
         name = str1;
         tell = str2;
         mail = str3;
      }
      public Adress()
      {
         name = "未登録のデータです";
         tell = "未登録のデータです";
         mail = "未登録のデータです";
      }
      public void show()
      {
         Console.WriteLine("------------アドレス情報------------");
         Console.WriteLine(
            String.Format("名前:{0}\n電話番号:{1}\nメールアドレス:{2}"
            , name, tell, mail));
      }
   }
}

実行結果
1
2
3
4
5
6
7
8
------------アドレス情報------------
名前:Europaris
電話番号:xxx-xxxx-xxxx
メールアドレス:europaris@xxx.xx.xx
------------アドレス情報------------
名前:未登録のデータです
電話番号:未登録のデータです
メールアドレス:未登録のデータです

今回のプログラムでは、12行目と13行目で「Adress」クラスのインスタンスを2つ実体化しています。12行目のインスタンス化では引数を設定し、13行目のインスタンス化では引数は指定していません。14行目と15行目では、それぞれのインスタンスが持つ「show」メソッドを呼び出して各インスタンスのフィールド情報をコンソール画面に出力しました。

この出力結果では、引数の違いによって異なるコンストラクタが呼ばれているのがわかります。今回のケースでは、「Adreee」クラスがインスタンス化されるときにインスタンスが持つフィールドの各情報が確定しているときと、確定していないときが想定されるため2つのコンストラクタを用意しました。このように、メソッドのオーバーロード機能はイニシャライザをオーバーロードする際に特に威力を発揮します。
   
Search:

Count:
inserted by FC2 system