Heim  >  Artikel  >  Backend-Entwicklung  >  Versionierung mit Override und neuen Schlüsselwörtern (C#-Programmierhandbuch)

Versionierung mit Override und neuen Schlüsselwörtern (C#-Programmierhandbuch)

黄舟
黄舟Original
2017-02-16 10:58:171477Durchsuche

Ursprüngliche Adresse: Klicken Sie hier, um den Link zu öffnen



Das hat viele Bedeutungen. Dies bedeutet beispielsweise, dass die Einführung eines neuen Mitglieds in einer Basisklasse mit demselben Namen wie ein Mitglied in einer abgeleiteten Klasse in C# vollständig unterstützt wird und nicht zu unerwartetem Verhalten führt. Es bedeutet auch, dass die Klasse explizit deklarieren muss, ob eine Methode eine geerbte Methode überschreiben soll oder eine neue Methode sein soll, die eine geerbte Methode mit einem ähnlichen Namen verbirgt.

In C# kann eine abgeleitete Klasse Methoden mit denselben Namen wie Basisklassenmethoden enthalten.

  • Basisklassenmethoden müssen als virtuell definiert werden.

  • Wenn einer Methode in einer abgeleiteten Klasse nicht das Schlüsselwort new oder override vorangestellt ist, gibt der Compiler eine Warnung aus und die Methode wird so angezeigt, als ob sie vorhanden wäre neu Führen Sie die gleichen Vorgänge wie Schlüsselwörter aus.

  • Wenn einer Methode in einer abgeleiteten Klasse das Schlüsselwort new vorangestellt ist, wird die Methode als unabhängig von der Methode in der Basis definiert Klasse .

  • Wenn einer Methode in einer abgeleiteten Klasse das Schlüsselwort override vorangestellt ist, ruft das Objekt der abgeleiteten Klasse stattdessen die Methode auf Aufrufen von Basisklassenmethoden.

  • Sie können das Schlüsselwort base verwenden, um Basisklassenmethoden aus einer abgeleiteten Klasse aufzurufen. Die Schlüsselwörter

  • override, virtual und new können auch für Attribute und Indizes verwendet werden Geräte und Ereignisse.

Wenn eine Methode als virtuell deklariert ist, kann jede Klasse, die diese Methode erbt, ihre eigene Version implementieren. Um eine Methode virtuell zu machen, müssen Sie den Modifikator virtual in der Methodendeklaration der Basisklasse verwenden. Dann kann die abgeleitete Klasse die virtuelle Basismethode mit dem Schlüsselwort override überschreiben oder das Schlüsselwort new verwenden, um die virtuelle Methode in der Basisklasse auszublenden. Wenn weder das Schlüsselwort override noch das Schlüsselwort new angegeben sind, gibt der Compiler eine Warnung aus und Methoden in der abgeleiteten Klasse verbergen Methoden in der Basisklasse.

GraphicsClass lautet wie folgt:

C#



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


Ihr Unternehmen verwendet diese Klasse. Und Sie verwenden es, um Ihre eigene Klasse abzuleiten, wenn Sie neue Methoden hinzufügen:

C#



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


Ihre Anwendung läuft einwandfrei, bis Unternehmen A eine neue Version von GraphicsClass veröffentlicht, ähnlich dem folgenden Code:

C#




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


Am Anfang gab es keine Probleme. Die neue Version bleibt binärkompatibel mit der alten Version. Jede bereitgestellte Software funktioniert weiterhin normal, auch wenn neue Klassen auf dem Computersystem installiert werden, auf dem sich die Software befindet. In Ihrer abgeleiteten Klasse verweisen alle vorhandenen Aufrufe der Methode DrawRectangle weiterhin auf Ihre Version.

Diese Warnung soll Sie daran erinnern, dass Sie überlegen müssen, wie die DrawRectangle-Methode in Ihrer Anwendung funktionieren soll.

Wenn Sie möchten, dass Ihre Methode die neue Basisklassenmethode überschreibt, verwenden Sie bitte das Schlüsselwort override:

C#



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


 派生自 YourDerivedGraphicsClass 的对象仍可以使用基关键字访问DrawRectangle 的基类版本

C#


base.DrawRectangle();


 为了避免这两个方法之间发生混淆,可以重命名您的方法。 这可能很耗费时间且容易出错,而且在某些情况下并不可行。 但是,如果您的项目相对较小,则可以使用 Visual Studio 的重构选项来重命名方法。 有关更多信息,请参见重构类和类型(类设计器)。

或者,也可以通过在派生类定义中使用关键字 new 来防止出现该警告:

C#


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


 这是默认行为。

重写和方法选择

 下面的方法将是兼容的:

C#


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


 重写方法不被视为是在类上进行声明的,而是在基类上声明的方法的新实现。 仅当 C# 编译器无法将方法调用与 Derived 上的原始方法匹配时,它才尝试将该调用与具有相同名称和兼容参数的重写方法匹配。 例如:

C#



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


 有两种方法可以避免此情况。 首先,避免将新方法声明为与虚方法同名。 其次,可以通过将 Derived 的实例强制转换为 Base 来使 C# 编译器搜索基类方法列表,从而使其调用虚方法。 由于是虚方法,因此将调用 Derived 上的 DoWork(int) 的实现。 例如:

C#


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


有关 new 和 override的更多示例,请参见 了解何时使用 Override 和 New 关键字(C# 编程指南)。

 以上就是使用 Override 和 New 关键字进行版本控制(C# 编程指南)的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn