매개변수의 수나 타입은 다르지만, 같은 기능을 하는 메서드라면 같은 이름으로 오버로드하여 쓰는 것이 좋다.
더 나아가, C#에서는 연산자와 메서드 간의 구분이 없기 떄문에, (모든 연산자는 아니지만) 연산자 또한 오버라이드하여 쓸 수 있다.
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Calculator.abs(-5));
Console.WriteLine(Calculator.abs(4.2342));
Console.WriteLine(Calculator.abs(200.009m));
}
}
class Calculator
{
public static int abs(int value)
{
return (value >= 0) ? value : -value;
}
public static double abs(double value)
{
return (value>=0) ? value : -value;
}
public static decimal abs(decimal value)
{
return value>=0 ? value : -value;
}
}
5
4.2342
200.009
class Program
{
static void Main(string[] args)
{
Console.WriteLine(new Kilogram(10)+new Kilogram(20));
Console.WriteLine(new Gram(500)+new Gram(1200));
Console.WriteLine(new Kilogram(3)+new Gram(2300));
Console.WriteLine(new Gram(320)+new Kilogram(5));
}
}
class Kilogram
{
public double value;
public Kilogram(double value) { this.value = value; }
public static Kilogram operator + (Kilogram k1, Kilogram k2)
{
return new Kilogram(k1.value+ k2.value);
}
public static Kilogram operator + (Kilogram k1, Gram g1)
{
return new Kilogram(k1.value + (g1.value / 1000.0));
}
public override string ToString()
{
return this.value + "kg";
}
}
class Gram
{
public double value;
public Gram(double value) { this.value = value; }
public static Gram operator + (Gram g1, Gram g2)
{
return new Gram(g1.value+g2.value);
}
public static Gram operator +(Gram g1, Kilogram k1)
{
return new Gram(k1.value * 1000 + g1.value);
}
public static Gram operator / (Gram g1, int num)
{
return new Gram(g1.value / (double)num);
}
public override string ToString()
{
return this.value + "g";
}
}
30kg
1700g
5.3kg
5320g