前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, メソッドの基礎, paramsキーワード
解説 §
型のメンバーはオーバーロードできます。オーバーロードとはメソッドやコンストラクタで、名前は同じでも引数の型が数が違うバリエーションを記述可能にする機能です。
この機能は、クラスライブラリにも多く使われています。
たとえば、最大値を取得するMath.Maxメソッドが整数でも実数でも使用できるのは、整数を受け取る多数のメソッドと実数を受け取る多数のメソッドが全てオーバーロードされて並んでいるからです。
罠の数々 §
- メソッドの戻り値の型が違うだけではオーバーロードは成立しない。引数の違いが必要だ
- メソッドの引数の名前が違うだけではオーバーロードは成立しない。引数の型か数が違う必要がある
- 名前が紛らわしいが、オーバーロード(overload)とオーバーライド(override)は全く違う別の機能である。間違えないように注意しよう。うっかり間違えて恥を書いた人もいるぞ
参考リンク §
メンバーのオーバーロード
Math.Max メソッド
サンプルソース: overload §
var x = new MySample();
x.SetMessage();
Console.WriteLine(x.MyMessage);
x.SetMessage(1);
Console.WriteLine(x.MyMessage);
x.SetMessage(123,456);
Console.WriteLine(x.MyMessage);
x.SetMessage("Hello World");
Console.WriteLine(x.MyMessage);
class MySample
{
public string MyMessage { get; set; }
public void SetMessage()
{
MyMessage = "ハロー";
}
public void SetMessage(int x)
{
MyMessage = $"x={x}";
}
public void SetMessage(int x, int y)
{
MyMessage = $"x={x} y={y}";
}
public void SetMessage(string message)
{
MyMessage = message;
}
}
実行結果 §
ハロー
x=1
x=123 y=456
Hello World
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
var x = new X();
x.sub(1, 2);
class X
{
public void sub(int x, int y)
{
Console.WriteLine("case 1");
}
public void sub(params int [] args)
{
Console.WriteLine("case 2");
}
}
- case 1
- case 2
- case 1とcase 2両方
- x.sub(1, 2);の呼び出しは曖昧だというエラーになる
- 実行すると応答がなくなる (ハングアップする)
[[解答]]