メソッド -オーバーロード-

ホームC#プログラミング応用講義 > オーバーロード

目次

多重定義

A(string str) { Console.WriteLine("渡されたのは『" + str + "』です"); }
B(int i) { Console.WriteLine("渡されたのは『" + i + "』です"); }

2つのメソッドが定義されています。A() も B() も渡された値を表示しますが、渡す文字列の型が違うため、
A(15);
B("仲間由紀恵");
とすることはできません。

もちろん A() と B() をうまく使い分ければ問題はありません。これに double や float の分を書いていけば、アルファベット Z までで足りるでしょう。
ちなみに float はおそらく入門講座で説明してないので軽く説明しておきます。

double は浮動小数点、すなわち小数専門の変数の型です。こちらは 64bit 分のメモリを確保します。64bit というと 264 までの値ですね。
これはそんなには要らないよ、というときには多少メモリを無駄遣いすることは明らかです。

よって、32bit の浮動小数点が用意されていますが、それが float 型です。実際には double 型に押され、多くの浮動小数点変数は double で宣言されます。

話を元に戻して、型が違うだけで「表示する」という共通の動作を持っているにもかかわらずまったく別のメソッド名をつけるというのは大変面倒です。

型だけではありません。
A(int a) { Console.WriteLine(a+10); }
B(int a,bool b) { if (b) Console.WriteLine("a+10=" + (a+10)); }
おまけの文字列をつけるか否かを bool 型で判別します。これも計算は同じなのに、オプションが違うだ けで待った区別のメソッド名が必要だと混乱の元になります。

プログラムにおいて混乱ほど困るものはありません。それが、同じ働きをする違うメソッド名のメソッドを区別していくなどということになると非常に大変で す。
それを解決する仕組みが「多重定義」です。

多くを重ねて定義する。これこそ上のような混乱を防ぐ最高の解決策です。
ほとんど同じ働きをするメソッドは同じ名前で定義しちゃおう。そんな便利な機能が用意されています。

A(string str) { Console.WriteLine("渡されたのは『" + str + "』です"); }
A(int i) { Console.WriteLine("渡されたのは『" + i + "』です"); }
多重定義をするのに特別なキーワードなどは全く必要ありません。ただ名前を同じにするだけで、多重定義とみなされます

A(int a) { Console.WriteLine(a+10); }
A(int a,bool b) { if (b) Console.WriteLine("a+10=" + (a+10)); }
引数の型・引数の数などが違っても同じように同名で定義すれば多重定義とみなされます。

詳細

多重定義という言葉でも通じますが、
overload
という英語を使って呼ぶのが一般的です。オーバーロードと読みます。

オーバーロードは名前を同じにして定義すればよいということでしたが、呼び出すときも同様です。

A(int a) { Console.WriteLine(a+10); }
A(int a,bool b) { if (b) Console.WriteLine("a+10=" + (a+10)); }

これの下を呼び出すには以下のようにします。
A(15,true);

この際、どのオーバーロードが呼び出すべきメソッドに該当するのか判断するのにあいまいさがあってはなりません。その点は厳格にしておかなければ、それこ そ混乱が起こります。

その判断基準は前回のべた「シグニチャ」がそれです。シグニチャは「判 断要素」と前回説明しましたが、そのすべての要素を書いておきましょう。
・メソッド名
・仮パラメータ
・修飾子


オーバーロードは上の中の
・メソッド名
が同じで、
・仮パラメータ
が違う場合がほとんどですが、修飾子が違う場合もあります。

オーバーロードの最も有名な例はWriteLine() メソッドです。これには十数個の オーバーロードが存在するため、
Console.WriteLine("仲間由紀恵");
Console.WriteLine(15);
としても問題なく処理されます。

しかし、上と下の WriteLine() は名前は同じでも違うメソッドであることを確認してください。1つの WriteLine() で処理することをオーバーロードと呼ぶのではなく、複数の WriteLine() が定義されていることをオーバーロードと呼ぶのです。

オーバーロードは上に述べたような基本動作は同じでオプションが違うというときには大いに利 用すべきです。
しかし、基本動作が違えばオーバーロードをしてはいけません。

この点に注意して利用すれば非常に便利な機能です。現に多くの .NET クラスライブラリの中のメソッドはオーバーロードされています。


[ ステップアップC# ] [ C#プログラミング応用講義 ]