多态性的类型

多态性意味着操作也可以应用于某些其他类型的值。

有多种类型的多态性:

  • 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");    
    }
}

NormalCarElectricCar 这两个类现在都有一种加油的方法,但是他们自己的实施。这是一个例子:

public static void Main()
{
    List<Car> cars = new List<Car>(){
        new NormalCar(),
        new ElectricCar()
    };
    
    cars.ForEach(x => x.refuel());
}

输出将如下:

用汽油加油
充电电池