メソッドの名前と引数をメソッドのシグニチャといいます。シグニチャが
異なれば、同じクラスに複数のメソッドが存在可能です。これをメソッドの
オーバーロードといいます。コンストラクタも
同一の名前なのに、引数が異なれば複数存在できましたね。
メソッドのオーバーロードは簡単です。同じ名前で、引数の型とか、個数を変えればよいわけです。
簡単な例を見てみましょう。
// overload01.cs
using System;
class Sq
{
public static int sq(int x)
{
Console.WriteLine("intバージョンが呼ばれました");
return x * x;
}
public static double sq(double x)
{
Console.WriteLine("doubleバージョンが呼ばれました");
return x * x;
}
}
class overload01
{
public static void Main()
{
Console.WriteLine("{0}の2乗は{1}です", 5, Sq.sq(5));
Console.WriteLine("{0}の2乗は{1}です", 0.5, Sq.sq(0.5));
}
}
Sqクラスには2つのsqメソッドがあります。一つはint型の引数を1つ持ち、もう一つはdouble型の引数を1つ持っているメソッドです。シグニチャが異なるのでオーバーロード
できます。実行結果は、次のようになります。
引数の型の違いにより、呼ばれるメソッドのバージョンが異なることがわかります。
オーバーロードされたメソッドは今までも何回も使ってきました。Console.WriteLineメソッドが代表的ですね。
次も簡単な例です。引数の個数が異なるオーバーロードの例です。
// overload02.cs
using System;
class MyClass
{
public int add(int x)
{
return x;
}
public int add(int x, int y)
{
return x + y;
}
public int add(int x, int y, int z)
{
return x + y + z;
}
}
class overload02
{
public static void Main()
{
MyClass mc = new MyClass();
Console.WriteLine("{0} = {1}", 10, mc.add(10));
Console.WriteLine("{0} + {1} = {2}", 10, 20, mc.add(10, 20));
Console.WriteLine("{0} + {1} + {2} = {3}", 10, 20, 30,
mc.add(10, 20, 30));
}
}
実行結果は、次のようになります。
これは、簡単ですね。
ところでもっとたくさんの 引数をもつ(何個有るかわからない)addメソッドを作るにはどうしたらよいのでしょうか。 何百個、何千個ものオーバーロードメソッドを用意しなくてはならないのでしょうか?
Update 31/Aug/2006 By Y.Kumei