Share via


Wann müssen die Schlüsselwörter "override" und "new" verwendet werden? (C#-Programmierhandbuch)

Aktualisiert: November 2007

In C# können Methoden in abgeleiteten Klassen denselben Namen wie Methoden in Basisklassen haben. Sie müssen dazu aber genau festlegen, wie die neue Methode verwendet werden soll. Im folgenden Beispiel wird die Verwendung des new-Schlüsselworts und des override-Schlüsselworts veranschaulicht.

Zunächst werden drei Klassen deklariert: eine base-Klasse mit dem Namen Car sowie die beiden davon abgeleiteten Klassen ConvertibleCar und Minivan. Die Basisklasse enthält lediglich die Methode DescribeCar, die eine Beschreibung des Autos an die Konsole sendet. Auch die abgeleiteten Klassen verfügen jeweils über eine Methode mit dem Namen DescribeCar, die die eindeutigen Eigenschaften anzeigt. Diese Methoden rufen auch die DescribeCar-Methode der Basisklasse auf, um zu veranschaulichen, auf welche Weise sie die Eigenschaften der Car-Klasse geerbt haben.

Um den Unterschied zu verdeutlichen, wird die ConvertibleCar-Klasse mithilfe des new-Schlüsselworts definiert, wohingegen die Minivan-Klasse mithilfe von override definiert wird.

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

Nun kann Code geschrieben werden, der Instanzen dieser Klassen erstellt und ihre Methoden aufruft, sodass sich die Objekte selbst beschreiben können:

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

Wie erwartet, sieht die Ausgabe folgendermaßen aus:

Four wheels and an engine.

----------

Four wheels and an engine.

A roof that opens up.

----------

Four wheels and an engine.

Carries seven people.

----------

Im nächsten Codeabschnitt wird ein Array von Objekten definiert, die von der Car-Basisklasse abgeleitet sind. Dieses Array kann Objekte des Typs Car, ConvertibleCar und Minivan aufnehmen. Das Array wird folgendermaßen deklariert:

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

Sie können eine foreach-Schleife verwenden, um für jedes im Array enthaltene Car-Objekt die DescribeCar-Methode aufzurufen. Dies geschieht auf folgende Art und Weise:

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

Diese Schleife generiert folgende Ausgabe:

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.

----------

Beachten Sie, dass die ConvertibleCar-Beschreibung nicht dem entspricht, was Sie möglicherweise erwartet haben. Da bei der Definition dieser Methode das new-Schlüsselwort verwendet wurde, wird nicht die Methode der abgeleiteten Klasse aufgerufen, sondern die Methode der Basisklasse. Das Minivan-Objekt ruft die überschriebene Methode ordnungsgemäß auf und erzeugt das erwartete Ergebnis.

Wenn Sie erzwingen möchten, dass alle von Car abgeleiteten Klassen die DescribeCar-Methode implementieren, sollten Sie eine neue Basisklasse erstellen, in der die DescribeCar-Methode als abstract definiert wird. Eine abstrakte Methode enthält keinerlei Code, sondern lediglich die Methodensignatur. Alle von dieser Basisklasse abgeleiteten Klassen müssen eine Implementierung von DescribeCar bereitstellen. Weitere Informationen finden Sie unter abstract.

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

Klassen und Strukturen (C#-Programmierhandbuch)

Versionsverwaltung mit den Schlüsselwörtern "override" und "new" (C#-Programmierhandbuch)