C# Language Types de polymorphisme


Exemple

Le polymorphisme signifie qu'une opération peut également être appliquée à des valeurs d'autres types.

Il existe plusieurs types de polymorphisme:

  • Polymorphisme ad hoc:
    contient function overloading . L'objectif est qu'une méthode puisse être utilisée avec différents types sans avoir besoin d'être générique.
  • Polymorphisme paramétrique:
    est l'utilisation de types génériques. Voir les génériques
  • Sous-typage:
    la cible hérite d'une classe pour généraliser une fonctionnalité similaire

Polymorphisme ad hoc

La cible du Ad hoc polymorphism est de créer une méthode pouvant être appelée par différents types de données sans avoir besoin de conversion de type dans l'appel de fonction ou les génériques. La méthode suivante (s) sumInt(par1, par2) peut être appelée avec différents types de données et possède pour chaque combinaison de types une implémentation propre:

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

Voici un exemple d'appel:

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
}

Sous-typage

Le sous-typage est l'utilisation de inherit d'une classe de base pour généraliser un comportement similaire:

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

Les deux classes NormalCar et ElectricCar ont maintenant une méthode pour se ravitailler, mais leur propre implémentation. Voici un exemple:

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

La sortie sera la suivante:

Faire le plein d'essence
Charge de la batterie