多态性的类型
多态性意味着操作也可以应用于某些其他类型的值。
有多种类型的多态性:
- Ad hoc 多态性:
包含function overloading
。目标是 Method 可以与不同类型一起使用,而不需要通用。 - 参数多态:
是泛型类型的使用。参见泛型 - 子类型:
具有类的目标继承以概括类似的功能
Ad hoc 多态性
Ad hoc polymorphism
的目标是创建一个方法,该方法可以由不同的数据类型调用,而无需在函数调用或泛型中进行类型转换。可以使用不同的数据类型调用以下方法 sumInt(par1, par2)
,并且对于每种类型的组合都有一个自己的实现:
public static int sumInt( int a, int b)
{
return a + b;
}
public static int sumInt( string a, string b)
{
int _a, _b;
if(!Int32.TryParse(a, out _a))
_a = 0;
if(!Int32.TryParse(b, out _b))
_b = 0;
return _a + _b;
}
public static int sumInt(string a, int b)
{
int _a;
if(!Int32.TryParse(a, out _a))
_a = 0;
return _a + b;
}
public static int sumInt(int a, string b)
{
return sumInt(b,a);
}
这是一个示例调用:
public static void Main()
{
Console.WriteLine(sumInt( 1 , 2 )); // 3
Console.WriteLine(sumInt("3","4")); // 7
Console.WriteLine(sumInt("5", 6 )); // 11
Console.WriteLine(sumInt( 7 ,"8")); // 15
}
分型
子类型是使用来自基类的继承来概括类似的行为:
public interface Car{
void refuel();
}
public class NormalCar : Car
{
public void refuel()
{
Console.WriteLine("Refueling with petrol");
}
}
public class ElectricCar : Car
{
public void refuel()
{
Console.WriteLine("Charging battery");
}
}
NormalCar
和 ElectricCar
这两个类现在都有一种加油的方法,但是他们自己的实施。这是一个例子:
public static void Main()
{
List<Car> cars = new List<Car>(){
new NormalCar(),
new ElectricCar()
};
cars.ForEach(x => x.refuel());
}
输出将如下:
用汽油加油
充电电池