virtual (C# Başvurusu)
anahtar virtual
sözcüğü bir yöntemi, özelliği, dizin oluşturucuyu veya olay bildirimini değiştirmek ve türetilmiş bir sınıfta geçersiz kılınmasına izin vermek için kullanılır. Örneğin, bu yöntem devralan herhangi bir sınıf tarafından geçersiz kılınabilir:
public virtual double Area()
{
return x * y;
}
Sanal üyenin uygulaması, türetilmiş bir sınıfta geçersiz kılınan bir üye tarafından değiştirilebilir. anahtar sözcüğünü virtual
kullanma hakkında daha fazla bilgi için bkz. Geçersiz Kılma ve Yeni Anahtar Sözcüklerle Sürüm Oluşturma ve Geçersiz Kılma ve Yeni Anahtar Sözcüklerin Ne Zaman Kullanılacağını Bilmek.
Açıklamalar
Bir sanal yöntem çağrıldığında, nesnenin çalışma zamanı türü geçersiz kılınan üye için denetleniyor. En türetilmiş sınıfta geçersiz kılınan üye çağrılır. Bu, türetilmiş hiçbir sınıf üyeyi geçersiz kılmadıysa özgün üye olabilir.
Varsayılan olarak yöntemler sanal olmayan yöntemlerdir. Sanal olmayan bir yöntemi geçersiz kılamazsınız.
Aşağıdaki örnekte bir sanal özellik gösterilmektedir:
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";
}
}
}
}
Sanal özellikler, bildirim ve çağırma söz dizimindeki farklar dışında sanal yöntemler gibi davranır.
- Sanal devralınan özellik, değiştiriciyi kullanan
override
bir özellik bildirimi eklenerek türetilmiş bir sınıfta geçersiz kılınabilir.
Örnek
Bu örnekte, Shape
sınıfı , y
ve sanal yönteminin iki koordinatını x
Area()
içerir. , ve gibi Circle
Cylinder
Sphere
farklı şekil sınıfları sınıfı devralır Shape
ve yüzey alanı her şekil için hesaplanır. Türetilen her sınıfın kendi geçersiz kılma uygulaması vardır Area()
.
Devralınan , Cylinder
ve Sphere
tüm sınıflarının Circle
aşağıdaki bildirimde gösterildiği gibi temel sınıfı başlatan oluşturucuları kullandığına dikkat edin.
public Cylinder(double r, double h): base(r, h) {}
Aşağıdaki program, yöntemiyle ilişkili nesneye göre yöntemin uygun uygulamasını Area()
çağırarak her şekil için uygun alanı hesaplar ve görüntüler.
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# dili belirtimi
Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.