virtueel (C#-verwijzing)
Het virtual
trefwoord wordt gebruikt om een methode, eigenschap, indexeerfunctie of gebeurtenisdeclaratie te wijzigen en toe te staan dat het wordt overschreven in een afgeleide klasse. Deze methode kan bijvoorbeeld worden overschreven door elke klasse die deze overschrijft:
public virtual double Area()
{
return x * y;
}
De implementatie van een virtueel lid kan worden gewijzigd door een overschrijvend lid in een afgeleide klasse. Zie Versiebeheer met de onderdrukking en nieuwe trefwoorden en weten wanneer u onderdrukking en nieuwe trefwoorden gebruikt voor meer informatie over het gebruik van het virtual
trefwoord.
Opmerkingen
Wanneer een virtuele methode wordt aangeroepen, wordt het runtimetype van het object gecontroleerd op een overschrijvend lid. Het overschrijvende lid in de meest afgeleide klasse wordt aangeroepen, wat het oorspronkelijke lid kan zijn, als er geen afgeleide klasse het lid heeft overschreven.
Standaard zijn methoden niet-virtueel. U kunt een niet-virtuele methode niet overschrijven.
In het volgende voorbeeld ziet u een virtuele eigenschap:
class MyBaseClass
{
// virtual automatically 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 automatically implemented property with ordinary property
// to provide specialized accessor behavior.
public override string Name
{
get
{
return _name;
}
set
{
if (!string.IsNullOrEmpty(value))
{
_name = value;
}
else
{
_name = "Unknown";
}
}
}
}
Virtuele eigenschappen gedragen zich als virtuele methoden, met uitzondering van de verschillen in declaratie- en aanroepsyntaxis.
- Een virtuele overgenomen eigenschap kan worden overschreven in een afgeleide klasse door een eigenschapsdeclaratie op te nemen die gebruikmaakt van de
override
wijzigingsfunctie.
Opmerking
In dit voorbeeld bevat de Shape
klasse de twee coördinaten x
en y
de Area()
virtuele methode. Verschillende shapeklassen, zoals Circle
, Cylinder
en Sphere
nemen de Shape
klasse over en het oppervlak wordt voor elke afbeelding berekend. Elke afgeleide klasse heeft een eigen onderdrukkings-implementatie van Area()
.
U ziet dat de overgenomen klassen Circle
en Cylinder
Sphere
alle constructors gebruiken die de basisklasse initialiseren, zoals wordt weergegeven in de volgende declaratie.
public Cylinder(double r, double h): base(r, h) {}
In het volgende programma wordt het juiste gebied voor elke afbeelding berekend en weergegeven door de juiste implementatie van de Area()
methode aan te roepen, afhankelijk van het object dat is gekoppeld aan de methode.
class TestClass
{
public class Shape
{
public const double PI = Math.PI;
protected double _x, _y;
public Shape()
{
}
public Shape(double x, double y)
{
_x = x;
_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;
}
}
public class Sphere : Shape
{
public Sphere(double r) : base(r, 0)
{
}
public override double Area()
{
return 4 * PI * _x * _x;
}
}
public 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#-taalspecificatie
Zie de C#-taalspecificatie voor meer informatie. De taalspecificatie is de definitieve bron voor de C#-syntaxis en het gebruik.