Versionsverwaltung mit den Schlüsselwörtern "override" und "new" (C#-Programmierhandbuch)Versioning with the Override and New Keywords (C# Programming Guide)

Die C#-Sprache wurde entwickelt, damit die Versionierung von base- (Basis-) und abgeleiteten Klassen in unterschiedlichen Bibliotheken weiterentwickelt und die Abwärtskompatibilität aufrechterhalten werden kann.The C# language is designed so that versioning between base and derived classes in different libraries can evolve and maintain backward compatibility. Das bedeutet z.B., dass die Einführung eines neuen Members in einer Basisklasse mit demselben Name wie ein Member in einer abgeleiteten Klasse von C# vollständig unterstützt wird und nicht zu unerwartetem Verhalten führt.This means, for example, that the introduction of a new member in a base class with the same name as a member in a derived class is completely supported by C# and does not lead to unexpected behavior. Das bedeutet auch, dass eine Klasse explizit angeben muss, ob eine Methode für das außer Kraft setzen einer geerbten Methode vorgesehen ist, oder ob eine Methode eine neue Methode ist, die eine Methode mit ähnlichem Namen verbirgt.It also means that a class must explicitly state whether a method is intended to override an inherited method, or whether a method is a new method that hides a similarly named inherited method.

In C# können abgeleitete Klassen Methoden mit dem gleichen Namen wie Basisklassen-Methoden enthalten.In C#, derived classes can contain methods with the same name as base class methods.

  • Die Basisklasse muss als virtual definiert werden.The base class method must be defined virtual.

  • Wenn der Methode in der abgeleiteten Klasse nicht die Schlüsselwörter new oder override vorangestellt sind, gibt der Compiler eine Warnung aus, und die Methode verhält sich, als ob das Schlüsselwort new vorhanden wäre.If the method in the derived class is not preceded by new or override keywords, the compiler will issue a warning and the method will behave as if the new keyword were present.

  • Wenn der Methode in der abgeleiteten Klasse das Schlüsselwort new vorangestellt ist, wird die Methode als unabhängig von der Methode in der Basisklasse definiert.If the method in the derived class is preceded with the new keyword, the method is defined as being independent of the method in the base class.

  • Wenn der Methode in der abgeleiteten Klasse das Schlüsselwort override vorangestellt ist, rufen Objekte der abgeleiteten Klasse diese Methode anstatt der Methode der Basisklasse auf.If the method in the derived class is preceded with the override keyword, objects of the derived class will call that method instead of the base class method.

  • Die Methode der Basisklasse kann mithilfe des Schlüsselworts base aus der Basisklasse heraus aufgerufen werden.The base class method can be called from within the derived class using the base keyword.

  • Die Schlüsselwörter override, virtual und new können auch auf Eigenschaften, Indexer und Ereignisse angewendet werden.The override, virtual, and new keywords can also be applied to properties, indexers, and events.

Standardmäßig sind C#-Methoden nicht virtuell.By default, C# methods are not virtual. Wenn eine Methode als virtuell deklariert wird, kann jede Klasse, die die Methode erbt, ihre eigene Version implementieren.If a method is declared as virtual, any class inheriting the method can implement its own version. Um eine Methode in eine virtuelle Methode zu transformieren, wird der Modifizierer virtual in der Methodendeklaration der Basisklasse verwendet.To make a method virtual, the virtual modifier is used in the method declaration of the base class. Die abgeleitete Klasse kann anschließend die virtuelle Methode der Basisklasse mithilfe des Schlüsselworts override überschreiben oder die virtuelle Methode in der Basisklasse mithilfe des Schlüsselworts new verbergen.The derived class can then override the base virtual method by using the override keyword or hide the virtual method in the base class by using the new keyword. Wenn weder das Schlüsselwort override noch das Schlüsselwort new angegeben ist, gibt der Compiler eine Warnung aus, und die Methode in der abgeleiteten Klasse verbirgt die Methode in der Basisklasse.If neither the override keyword nor the new keyword is specified, the compiler will issue a warning and the method in the derived class will hide the method in the base class.

Nehmen wir zur Veranschaulichung dieser Vorgehensweise für einen Moment an, dass die Firma A eine Klasse mit dem Namen GraphicsClass erstellt, die Ihr Programm benutzt.To demonstrate this in practice, assume for a moment that Company A has created a class named GraphicsClass, which your program uses. Die folgende Datei ist GraphicsClass:The following is GraphicsClass:

class GraphicsClass
{
    public virtual void DrawLine() { }
    public virtual void DrawPoint() { }
}

Ihr Unternehmen verwendet diese Klasse, und Sie verwenden sie zum Ableiten einer Klasse oder zum Hinzufügen einer neuen Methode:Your company uses this class, and you use it to derive your own class, adding a new method:

class YourDerivedGraphicsClass : GraphicsClass
{
    public void DrawRectangle() { }
}

Ihre Anwendung wird ohne Probleme verwendet, bis Firma A eine neue Version von GraphicsClass herausgibt, die dem folgenden Code ähnelt:Your application is used without problems, until Company A releases a new version of GraphicsClass, which resembles the following code:

class GraphicsClass
{
    public virtual void DrawLine() { }
    public virtual void DrawPoint() { }
    public virtual void DrawRectangle() { }
}

Die neue Version von GraphicsClass enthält jetzt eine Methode namens DrawRectangle.The new version of GraphicsClass now contains a method named DrawRectangle. Anfänglich geschieht nichts.Initially, nothing occurs. Die neue Version ist immer noch binärkompatibel mit der alten Version.The new version is still binary compatible with the old version. Jede Software, die Sie entwickelt haben, funktioniert weiterhin, sogar wenn die neue Klasse auf diesen Computersystemen installiert ist.Any software that you have deployed will continue to work, even if the new class is installed on those computer systems. Aufgrund vorhandener Aufrufe der Methode verweist DrawRectangle weiterhin auf Ihre Version in Ihrer abgeleiteten Klasse.Any existing calls to the method DrawRectangle will continue to reference your version, in your derived class.

Sobald Sie Ihre Anwendung aber mit der neuen Version von GraphicsClass neu kompilieren, erhalten Sie vom Compiler eine Warnung, CS0108.However, as soon as you recompile your application by using the new version of GraphicsClass, you will receive a warning from the compiler, CS0108. Diese Warnung informiert Sie darüber, dass Sie das gewünschte Verhalten der DrawRectangle-Methode in Ihrer Anwendung bestimmen müssen.This warning informs you that you have to consider how you want your DrawRectangle method to behave in your application.

Wenn Sie möchten, dass Ihre Methode die neue Basisklassenmethode außer Kraft setzt, verwenden Sie das Schlüsselwort override:If you want your method to override the new base class method, use the override keyword:

class YourDerivedGraphicsClass : GraphicsClass
{
    public override void DrawRectangle() { }
}

Das Schlüsselwort override stellt sicher, dass alle Objekte, die von YourDerivedGraphicsClass abgeleitet sind, die Version von DrawRectangle der abgeleiteten Klasse verwenden.The override keyword makes sure that any objects derived from YourDerivedGraphicsClass will use the derived class version of DrawRectangle. Objekte, die von YourDerivedGraphicsClass abgeleitet sind, können auf die Basisklassenversion von DrawRectangle mithilfe des base-Schlüsselworts zugreifen:Objects derived from YourDerivedGraphicsClass can still access the base class version of DrawRectangle by using the base keyword:

base.DrawRectangle();

Wenn Sie nicht möchten, dass Ihre Methode die neue Basisklassenmethode außer Kraft setzt, gelten die folgenden Überlegungen.If you do not want your method to override the new base class method, the following considerations apply. Sie können Ihre Methode umbenennen, um Verwechslungen zwischen den beiden Methoden zu vermeiden.To avoid confusion between the two methods, you can rename your method. Dies kann zeitaufwändig und fehleranfällig sein und ist in einigen Fällen einfach nicht praktikabel.This can be time-consuming and error-prone, and just not practical in some cases. Wenn das Projekt aber relativ klein ist, können Sie die Refactoring-Optionen von Visual Studio verwenden, um die Methode umzubenennen.However, if your project is relatively small, you can use Visual Studio's Refactoring options to rename the method. Weitere Informationen finden Sie unter Refactoring von Klassen und Typen (Klassen-Designer).For more information, see Refactoring Classes and Types (Class Designer).

Alternativ können Sie die Warnung vermeiden, indem Sie in der Definition Ihrer abgeleiteten Klasse das Schlüsselwort new verwenden:Alternatively, you can prevent the warning by using the keyword new in your derived class definition:

class YourDerivedGraphicsClass : GraphicsClass
{
    public new void DrawRectangle() { }
}

Mit dem Schlüsselwort new teilt der Compiler mit, dass Ihre Definition die Definition ausblendet, die in der Basisklasse enthalten ist.Using the new keyword tells the compiler that your definition hides the definition that is contained in the base class. Dies ist das Standardverhalten.This is the default behavior.

Überschreiben und MethodenauswahlOverride and Method Selection

Wenn eine Methode in einer Klasse benannt wird, wählt der C#-Compiler die beste Methode zum Aufrufen aus, wenn mehr als eine Methode mit dem Aufruf kompatibel ist, z.B. wenn es zwei Methoden mit dem gleichen Namen und Parameter gibt, die mit dem übergebenen Parameter kompatibel sind.When a method is named on a class, the C# compiler selects the best method to call if more than one method is compatible with the call, such as when there are two methods with the same name, and parameters that are compatible with the parameter passed. Die folgenden Methoden wären kompatibel:The following methods would be compatible:

public class Derived : Base
{
    public override void DoWork(int param) { }
    public void DoWork(double param) { }
}

Wenn DoWork für eine Instanz von Derived aufgerufen wird, versucht der C#-Compiler zuerst, den Aufruf mit den Versionen von DoWork kompatibel zu machen, die ursprünglich für Derived deklariert wurden.When DoWork is called on an instance of Derived, the C# compiler will first try to make the call compatible with the versions of DoWork declared originally on Derived. Override-Methoden werden nicht als Methoden angesehen, die für eine Klasse deklariert sind. Stattdessen sind sie neue Implementierungen einer Methode, die für eine Basisklasse deklariert wurde.Override methods are not considered as declared on a class, they are new implementations of a method declared on a base class. Nur wenn der C#-Compiler keine Übereinstimmung des Methodenaufrufs mit dem Aufruf einer ursprünglichen Methode in Derived feststellen kann, versucht er, den Aufruf mit einer überschriebenen Methode mit dem gleichen Namen und kompatiblen Parametern übereinzustimmen.Only if the C# compiler cannot match the method call to an original method on Derived will it try to match the call to an overridden method with the same name and compatible parameters. Zum Beispiel:For example:

int val = 5;
Derived d = new Derived();
d.DoWork(val);  // Calls DoWork(double).

Da die Variable val implizit in einen Double-Wert konvertiert werden kann, ruft der C#-Compiler DoWork(double) anstelle von DoWork(int) auf.Because the variable val can be converted to a double implicitly, the C# compiler calls DoWork(double) instead of DoWork(int). Es gibt zwei Möglichkeiten, das zu vermeiden.There are two ways to avoid this. Vermeiden Sie zuerst das Deklarieren neuer Methoden mit dem gleichen Namen wie virtuelle Methoden.First, avoid declaring new methods with the same name as virtual methods. Zweitens können Sie den C#-Compiler anweisen, die virtuelle Methode aufzurufen, indem Sie eine Suche nach der Liste der Basisklassenmethode durchführen lassen. Dies geschieht durch umwandeln der Instanz von Derived in Base.Second, you can instruct the C# compiler to call the virtual method by making it search the base class method list by casting the instance of Derived to Base. Da es sich um eine virtuelle Methode handelt, wird die Implementierung von DoWork(int) auf Derived aufgerufen.Because the method is virtual, the implementation of DoWork(int) on Derived will be called. Zum Beispiel:For example:

((Base)d).DoWork(val);  // Calls DoWork(int) on Derived.

Weitere Beispiele für new und override finden Sie unter Wann müssen die Schlüsselwörter „override“ und „new“ verwendet werden?.For more examples of new and override, see Knowing When to Use Override and New Keywords.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
Klassen und StrukturenClasses and Structs
MethodenMethods
VererbungInheritance