virtual (C#-Referenz)

Aktualisiert: November 2007

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.

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 Dimensions-Klasse die beiden Koordinaten x und y sowie die virtuelle Area()-Methode. Verschiedene Formklassen wie Circle, Cylinder und Sphere erben die Dimensions-Klasse, und für jede Figur wird die Oberfläche berechnet. Jede abgeleitete Klasse verfügt über ihre eigene override-Implementierung von Area(). Das Programm berechnet die Fläche für jede Figur, indem die passende Implementierung von Area() entsprechend dem mit der Methode verbundenen Objekt aufgerufen wird, und zeigt sie an.

Beachten Sie, dass alle geerbten Klassen, nämlich Circle, Sphere und Cylinder, Konstruktoren verwenden, die die Basisklasse initialisieren, z. B.:

public Cylinder(double r, double h): base(r, h) {}

Dies entspricht der C++-Initialisierungsliste.

class TestClass
{
    public class Dimensions
    {
        public const double PI = Math.PI;
        protected double x, y;
        public Dimensions()
        {
        }
        public Dimensions(double x, double y)
        {
            this.x = x;
            this.y = y;
        }

        public virtual double Area()
        {
            return x * y;
        }
    }

    public class Circle : Dimensions
    {
        public Circle(double r) : base(r, 0)
        {
        }

        public override double Area()
        {
            return PI * x * x;
        }
    }

    class Sphere : Dimensions
    {
        public Sphere(double r) : base(r, 0)
        {
        }

        public override double Area()
        {
            return 4 * PI * x * x;
        }
    }

    class Cylinder : Dimensions
    {
        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;
        Dimensions c = new Circle(r);
        Dimensions s = new Sphere(r);
        Dimensions 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 finden Sie in den folgenden Abschnitten von C#-Programmiersprachenspezifikation:

  • 1.6.6.4 Virtuelle, Überschreibungs- und abstrakte Methoden

  • 10.6.3 Virtuelle Methoden

  • 10.7.5 Virtuelle, versiegelte, Überschreibungs- und abstrakte Accessoren

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

Modifizierer (C#-Referenz)

C#-Schlüsselwörter

Polymorphismus (C#-Programmierhandbuch)

abstract (C#-Referenz)

override (C#-Referenz)

new (C#-Referenz)

Weitere Ressourcen

C#-Referenz