Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
virtual Yöntemi, özelliği, dizin oluşturucuyu veya olay bildirimini değiştirmek ve türetilmiş bir sınıfın bunu geçersiz kılmasına izin vermek için anahtar sözcüğünü kullanın.
C# dili başvuru belgesi, C# dilinin en son yayımlanan sürümünü gösterir. Ayrıca, yaklaşan dil sürümü için genel önizlemelerdeki özelliklere yönelik ilk belgeleri içerir.
Belgelerde ilk olarak dilin son üç sürümünde veya geçerli genel önizlemelerde sunulan tüm özellikler tanımlanır.
Tavsiye
Bir özelliğin C# dilinde ilk tanıtıldığı zamanları bulmak için C# dil sürümü geçmişi makalesine bakın.
Örneğin, bu yöntemi devralan tüm sınıflar bunu geçersiz kılabilir:
public virtual double Area()
{
return x * y;
}
Türetilmiş bir sınıfta geçersiz kılınan bir üye , sanal üyenin uygulamasını değiştirebilir. Daha fazla bilgi için, virtual anahtar sözcüğünü kullanma hakkında 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.
Bir sanal yöntemi çağırdığınızda, çalışma zamanı geçersiz kılınan bir üye için nesnenin türünü denetler. En türetilmiş sınıfta geçersiz kılınan üyeyi çağırır. Türetilmiş sınıf üyeyi geçersiz kılmazsa, özgün üye çağrılır.
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 bir özellik, c0 değiştiricisini kullanan bir özellik bildirimi eklenerek türetilmiş bir sınıfta geçersiz kılınabilir.
Örnek
Bu örnekte, Shape sınıfı iki koordinat x ve yve Area() sanal yöntemini içerir.
Circle, Cylinder ve Sphere gibi farklı şekil sınıfları Shape sınıfını devralır ve yüzey alanı her şekil için hesaplanır. Türetilen her sınıfın, Area() için kendi geçersiz kılma uygulaması bulunur.
Devralınan sınıflar Circle, Cylinderve Sphere tümü, aşağıdaki bildirimde gösterildiği gibi temel sınıfı başlatan oluşturucuları kullanır.
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 = {c.Area():F2}");
Console.WriteLine($"Area of Sphere = {s.Area():F2}");
Console.WriteLine($"Area of Cylinder = {l.Area():F2}");
}
}
/*
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.