p.195 メソッドのオーバーロード
・既述の通り、コンストラクタと同様にメソッドもオーバーロードが可能 ・なお、メソッドのシグニチャには戻り値型は含まれないので、戻り値型のみが異なるメソッドのオーバーロードは認められずエラーになる
p.195 overload01.cs
//p.195 overload01.cs
using System;
class manymethods {
public int Method(int x) {
Console.WriteLine("第1のバージョンが呼ばれました");
return x + 10;
}
public double Method(double x) {
Console.WriteLine("第2のバージョンが呼ばれました");
return x * 2;
}
public string Method(string x) {
Console.WriteLine("第3のバージョンが呼ばれました");
return x += "です";
}
public int Method(int x, int y) {
Console.WriteLine("第4のバージョンか呼ばれました");
return x + y;
}
}
class overload01 {
public static void Main() {
manymethods m = new manymethods();
Console.WriteLine("その戻り値は「{0}」です", m.Method(3)); //第1のバージョンが呼ばれる
Console.WriteLine("その戻り値は「{0}」です", m.Method(3.2)); //第2のバージョンが呼ばれる
Console.WriteLine("その戻り値は「{0}」です", m.Method("粂井")); //第3のバージョンが呼ばれる
Console.WriteLine("その戻り値は「{0}」です", m.Method(5, 6)); //第4のバージョンが呼ばれる
}
}
アレンジ演習:p.195 overload01.cs
・下記のシグニチャのMaxメソッドのオーバーロードを持つクラスMaxsを作成し、動作を確認しよう Max(int,int) //整数2値の最大値を返す Max(int,int,int) //整数3値の最大値を返す Max(int[]) //整数配列の要素の最大値を返す
作成例
//アレンジ演習:p.195 overload01.cs
using System;
class Maxs {
public int Max(int x, int y) { //整数2値の最大値を返す
return (x > y) ? x : y;
}
public int Max(int x, int y, int z) { //整数3値の最大値を返す
int max = (x > y) ? x : y; //2値の最大値を得てから
return (max > z) ? max : z; //3値目比べる
}
public int Max(int[] a) {
int max = a[0]; //仮に先頭要素が最大とする
for (int i = 1; i < a.Length; i++) { //先頭の次の要素から全要素について繰り返す
if (max < a[i]) { //最大値超ならば
max = a[i]; //最大値更新
}
}
return max; //最大値を返す
}
}
class overload01 {
public static void Main() {
Maxs m = new Maxs();
Console.WriteLine("Max(3, 2) = {0}", m.Max(3, 2)); //第1のバージョンが呼ばれる
Console.WriteLine("Max(3, 4, 2) = {0}", m.Max(3, 4, 2)); //第2のバージョンが呼ばれる
int[] ma = {3, 4, 8, 2};
Console.WriteLine("Max(3, 4, 8, 2) = {0}", m.Max(ma)); //第3のバージョンが呼ばれる
}
}
作成例・効率アップバージョン
//アレンジ演習:p.195 overload01.cs
using System;
class Maxs {
public int Max(int x, int y) { //①整数2値の最大値を返す
int[] w = {x, y}; //2値を配列にして
return Max(w); //③を呼ぶ
}
public int Max(int x, int y, int z) { //②整数3値の最大値を返す
int[] w = {x, y, z}; //3値を配列にして
return Max(w); //③を呼ぶ
}
public int Max(int[] a) { //③整数配列の最大値を返す
int max = a[0]; //仮に先頭要素が最大とする
for (int i = 1; i < a.Length; i++) { //先頭の次の要素から全要素について繰り返す
if (max < a[i]) { //最大値超ならば
max = a[i]; //最大値更新
}
}
return max; //最大値を返す
}
}
class overload01 {
public static void Main() {
Maxs m = new Maxs();
Console.WriteLine("Max(3, 2) = {0}", m.Max(3, 2)); //第1のバージョンが呼ばれる
Console.WriteLine("Max(3, 4, 2) = {0}", m.Max(3, 4, 2)); //第2のバージョンが呼ばれる
int[] ma = {3, 4, 8, 2};
Console.WriteLine("Max(3, 4, 8, 2) = {0}", m.Max(ma)); //第3のバージョンが呼ばれる
}
}
提出:アレンジ演習:p.195 overload01.cs
参考:効率アップバージョンの有効活用
・下記のシグニチャのMaxメソッドのオーバーロードを持つクラスMaxsを作成できる
Max(int,int) //整数2値の最大値を返す
Max(int,int,int) //整数3値の最大値を返す
Max(double,duuble,duuble,duuble) //実数4値の最大値を返す
Max(double[]) //実数配列の要素の最大値を返す
//参考:効率アップバージョンの有効活用
using System;
class Maxs {
public int Max(int x, int y) { //①整数2値の最大値を返す
double[] w = {x, y}; //2値を実数配列にして
return (int)Max(w); //④を呼び、戻り値をintにキャストする
}
public int Max(int x, int y, int z) { //②整数3値の最大値を返す
double[] w = {x, y, z}; //3値を実数配列にして
return (int)Max(w); //④を呼び、戻り値をintにキャストする
}
public double Max(double x, double y, double z, double a) { //③実数4値の最大値を返す
double[] w = {x, y, z, a}; //4値を配列にして
return Max(w); //④を呼ぶ
}
public double Max(double[] a) { //④実数配列の最大値を返す
double max = a[0]; //仮に先頭要素が最大とする
for (int i = 1; i < a.Length; i++) { //先頭の次の要素から全要素について繰り返す
if (max < a[i]) { //最大値超ならば
max = a[i]; //最大値更新
}
}
return max; //最大値を返す
}
}
class overload01 {
public static void Main() {
Maxs m = new Maxs();
Console.WriteLine("Max(3, 2) = {0}", m.Max(3, 2)); //第1のバージョンが呼ばれる
Console.WriteLine("Max(3, 4, 2) = {0}", m.Max(3, 4, 2)); //第2のバージョンが呼ばれる
Console.WriteLine("Max(3.3, 4.4, 2.2, 6.6) = {0}", m.Max(3.3, 4.4, 2.2, 6.6)); //第3のバージョンが呼ばれる
Console.WriteLine("Max(3.3, 4.4, 8.8) = {0}", m.Max(new double[] {3.3, 4.4, 8.8})); //第4のバージョンが呼ばれる
}
}