virtual (C#-Referenz)
Mit dem virtual-Schlüsselwort können eine Methode, eine Eigenschaft, ein Indexer oder eine Ereignisdeklaration geändert und in einer abgeleiteten Klasse überschrieben werden. Zum Beispiel kann diese Methode von jeder Klasse überschrieben werden, die diese Methode erbt:
public virtual double Area()
{
return x * y;
}
Die Implementierung eines virtuellen Members kann durch einen override-Member in einer abgeleiteten Klasse geändert werden. Weitere Informationen zur Verwendung des virtual-Schlüsselworts finden Sie unter Versionsverwaltung mit den Schlüsselwörtern "override" und "new" (C#-Programmierhandbuch) und Wann müssen die Schlüsselwörter "override" und "new" verwendet werden? (C#-Programmierhandbuch).
Hinweise
Wenn eine virtuelle Methode aufgerufen wird, wird der Laufzeittyp des Objekts auf einen überschreibenden Member hin überprüft und der überschreibende Member der tiefsten abgeleiteten Klasse aufgerufen. Wenn keine abgeleitete Klasse den Member überschrieben hat, handelt es sich hierbei möglicherweise um den ursprünglichen Member.
Standardmäßig sind Methoden nicht virtuell. Eine nicht virtuelle Methode darf nicht überschrieben werden.
Der virtual-Modifizierer kann nicht zusammen mit den Modifizierern static, abstract, private oder override verwendet werden. Im folgenden Beispiel wird eine virtuelle Eigenschaft veranschaulicht:
class MyBaseClass
{
// virtual auto-implemented property. Overrides can only
// provide specialized behavior if they implement get and set accessors.
public virtual string Name { get; set; }
// ordinary virtual property with backing field
private int num;
public virtual int Number
{
get { return num; }
set { num = value; }
}
}
class MyDerivedClass : MyBaseClass
{
private string name;
// Override auto-implemented property with ordinary property
// to provide specialized accessor behavior.
public override string Name
{
get
{
return name;
}
set
{
if (value != String.Empty)
{
name = value;
}
else
{
name = "Unknown";
}
}
}
}
Virtuelle Eigenschaften verhalten sich wie abstrakte Methoden, mit Ausnahme der Unterschiede bei der Deklaration und der Syntax für den Aufruf.
Der virtual-Modifizierer darf nicht für eine statische Eigenschaft verwendet werden.
In einer abgeleiteten Klasse kann eine virtuelle vererbte Eigenschaft überschrieben werden, indem eine Eigenschaftendeklaration, die den override-Modifizierer verwendet, eingeschlossen wird.
Beispiel
In diesem Beispiel enthält die Shape-Klasse die beiden Koordinaten x und y sowie die virtuelle Area()-Methode. Verschiedene Formklassen wie Circle, Cylinder und Sphere erben die Shape-Klasse, und für jede Figur wird die Oberfläche berechnet. Jede abgeleitete Klasse verfügt über ihre eigene override-Implementierung von Area().
Beachten Sie, dass die geerbten Klassen Circle, Sphereund alle Cylinder verwenden konstruktoren, die die Basisklasse initialisiert werden, wie in der folgenden Deklaration veranschaulicht.
public Cylinder(double r, double h): base(r, h) {}
Das folgende Programm berechnet und zeigt den entsprechenden Bereich für jede Figur an, indem er die entsprechende Implementierung der Area()-Methode entsprechend dem Objekt aufruft, das mit der Methode zugeordnet ist.
class TestClass
{
public class Shape
{
public const double PI = Math.PI;
protected double x, y;
public Shape()
{
}
public Shape(double x, double y)
{
this.x = x;
this.y = y;
}
public virtual double Area()
{
return x * y;
}
}
public class Circle : Shape
{
public Circle(double r) : base(r, 0)
{
}
public override double Area()
{
return PI * x * x;
}
}
class Sphere : Shape
{
public Sphere(double r) : base(r, 0)
{
}
public override double Area()
{
return 4 * PI * x * x;
}
}
class Cylinder : Shape
{
public Cylinder(double r, double h) : base(r, h)
{
}
public override double Area()
{
return 2 * PI * x * x + 2 * PI * x * y;
}
}
static void Main()
{
double r = 3.0, h = 5.0;
Shape c = new Circle(r);
Shape s = new Sphere(r);
Shape l = new Cylinder(r, h);
// Display results:
Console.WriteLine("Area of Circle = {0:F2}", c.Area());
Console.WriteLine("Area of Sphere = {0:F2}", s.Area());
Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());
}
}
/*
Output:
Area of Circle = 28.27
Area of Sphere = 113.10
Area of Cylinder = 150.80
*/
C#-Programmiersprachenspezifikation
Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.
Siehe auch
Referenz
Polymorphismus (C#-Programmierhandbuch)