Partager via


Savoir quand utiliser les mots clés override et new (Guide de programmation C#)

Mise à jour : novembre 2007

C# permet aux méthodes des classes dérivées d'avoir le même nom que les méthodes des classes de base — tant que vous êtes très précis sur la manière avec laquelle la nouvelle méthode doit être traitée. L'exemple suivant illustre l'utilisation des mots clés new et override.

En premier lieu, trois classes sont déclarées : une classe de base appelée Car, et deux classes qui en dérivent, ConvertibleCar et Minivan. La classe de base contient une seule méthode, DescribeCar, qui envoie une description de la voiture à la console. Les méthodes des classes dérivées comprennent également une méthode appelée DescribeCar, qui affiche leurs propriétés uniques. Ces méthodes appellent également la méthode DescribeCar de la classe de base pour démontrer qu'elles ont hérité des propriétés de la classe Car.

Pour souligner la différence, la classe ConvertibleCar est définie avec le mot clé new, tandis que la classe Minivan est définie avec override.

// Define the base class
class Car
{
    public virtual void DescribeCar()
    {
        System.Console.WriteLine("Four wheels and an engine.");
    }
}

// Define the derived classes
class ConvertibleCar : Car
{
    public new virtual void DescribeCar()
    {
        base.DescribeCar();
        System.Console.WriteLine("A roof that opens up.");
    }
}

class Minivan : Car
{
    public override void DescribeCar()
    {
        base.DescribeCar();
        System.Console.WriteLine("Carries seven people.");
    }
}

Nous pouvons maintenant écrire du code qui déclare les instances de ces classes, et appelle leurs méthodes pour que les objets puissent se décrire eux-mêmes :

public static void TestCars1()
{
    Car car1 = new Car();
    car1.DescribeCar();
    System.Console.WriteLine("----------");

    ConvertibleCar car2 = new ConvertibleCar();
    car2.DescribeCar();
    System.Console.WriteLine("----------");

    Minivan car3 = new Minivan();
    car3.DescribeCar();
    System.Console.WriteLine("----------");
}

Comme vous pouvez vous y attendre, la sortie ressemble à ceci :

Four wheels and an engine.

----------

Four wheels and an engine.

A roof that opens up.

----------

Four wheels and an engine.

Carries seven people.

----------

Toutefois, dans cette section de code suivante, nous déclarons un tableau d'objets dérivé de la classe de base Car. Ce tableau peut stocker des objets Car, ConvertibleCar et Minivan. Le tableau est déclaré comme suit :

public static void TestCars2()
{
    Car[] cars = new Car[3];
    cars[0] = new Car();
    cars[1] = new ConvertibleCar();
    cars[2] = new Minivan();
}

Nous pouvons utiliser ensuite une boucle foreach pour visiter chaque objet Car contenu dans le tableau, et appelons la méthode DescribeCar, comme ceci :

foreach (Car vehicle in cars)
{
    System.Console.WriteLine("Car object: " + vehicle.GetType());
    vehicle.DescribeCar();
    System.Console.WriteLine("----------");
}

La sortie de cette boucle donne ceci :

Car object: YourApplication.Car

Four wheels and an engine.

----------

Car object: YourApplication.ConvertibleCar

Four wheels and an engine.

----------

Car object: YourApplication.Minivan

Four wheels and an engine.

Carries seven people.

----------

Notez en quoi la description ConvertibleCar ne répond pas à vos attentes. Comme le mot clé new a été utilisé pour définir cette méthode, la méthode de la classe dérivée n'est appelée. C'est la méthode de la classe de base qui est appelée à la place. L'objet Minivan appelle correctement la méthode substituée, en produisant les résultats attendus.

Si vous souhaitez appliquer une règle stipulant que toutes les classes dérivées de Car doivent implémenter la méthode DescribeCar, vous devez créer une nouvelle classe de base qui définit la méthode DescribeCar comme abstract. Une méthode abstraite ne contient pas de code, uniquement la signature de la méthode. Toutes les classes dérivées de cette classe de base doivent fournir une implémentation de DescribeCar. Pour plus d'informations, consultez abstract.

Voir aussi

Concepts

Guide de programmation C#

Référence

Classes et structs (Guide de programmation C#)

Versioning avec les mots clés override et new (Guide de programmation C#)