Virtual

De Banane Atomic
Révision datée du 28 novembre 2016 à 13:31 par Nicolas (discussion | contributions) (Remplacement de texte — « <boxx>([^=]+)<\/boxx> » par « {{boxx|$1}} »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigationAller à la recherche

Dans cet exemple on appelle la méthode AfficheDescription sur une référence de type Employé :

(Employé)employé.AfficheDescription()

Pourtant si l'objet employé est de type Ingénieur, c'est la méthode AfficheDescription de la classe Ingénieur qui sera appelée : override.
Par contre si l'objet employé est de type Commercial, c'est la méthode AfficheDescription de la classe Employé qui sera appelée : new.
La méthode AfficheDescription de la classe Commercial ne peut être appelée que si la référence est de type Commercial et non Employé : new désactive le polymorphisme.

Csharp.svg
public static void Main(string[] args)
{
    var employés = new Employé[] {
        new Ingénieur("Nicolas"),
        new Commercial("Kévin") };

    foreach (Employé employé in employés)
    {
        employé.AfficheDescription();
    }
}

// C'est une classe polymorphe car elle contient une méthode virtuelle
public class Employé
{
    protected string _nom;
    public Employé(string nom)
    {
        _nom = nom;
    }

    public virtual void AfficheDescription()
    {
        Console.Write("Nom : {0}", _nom);
    }
}

public class Ingénieur : Employé
{
    public Ingénieur(string nom)
        : base(nom)
    { }

    public override void AfficheDescription()
    {
        base.AfficheDescription();
        Console.WriteLine("\tFonction : ingénieur");
    }
}

public class Commercial : Employé
{
    public Commercial(string nom)
        : base(nom)
    { }

    public new void AfficheDescription()
    {
        base.AfficheDescription();
        Console.WriteLine("\tFonction : commercial");
    }
}