الظاهري ( مرجع C# )
الكلمة الأساسية virtual تستخدم لتعديل الأسلوب, أو الخاصية, أو المفهرس أو الحدث, أو السماح لها بتجاوز الفئة المشتقة. على سبيل المثال، من الممكن إبطال هذا الأسلوب مع أية فئة ترثه:
public virtual double Area()
{
return x * y;
}
تغيير تنفيذ الأعضاء الظاهرية عن طريق عضو متجاوز في الفئة المشتقة. للمزيد من المعلومات حول كيفية استخدام الكلمة الأساسية virtual ، راجع تعيين الإصدارات مع الكلمات الأساسية override و new (دليل البرمجة لـ #C) , معرفة وقت استخدام المنع و كلمات أساسية جديدة (إرشادات البرمجة لـ C#).
ملاحظات
عندما يتم استدعاء أسلوب ظاهري، يتم فحص نوع وقت التشغيل للكائن للعضو المهيمن يتم استدعاء العضو المتجاوز في أكثر فئة مكتسبة ، الذي قد يكون العضو الأصلي، إذا لم يوجد فئة مشتقة تجاوز العضو.
أساليب C# تكون غير ظاهرية بشكل افتراضي. لا يمكن يمنع الأسلوب الغير ظاهري.
لا يمكنك استخدام المعدل virtual مع static, abstract, private، أو المعدلات override . يظهر المثال التالي خاصية ظاهرية:
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";
}
}
}
}
الخصائص الافتراضية تتصرف مثل الأساليب المجردة، باستثناء الاختلافات في بناء جملة التعريف و الاستدعاء.
من الخطأ استخدام معدل التشغيل virtual في خاصية ثابتة.
يمكن أن يتم تجاوز خاصية متوارثة ظاهرية في فئة مشتقة بما في ذلك تعريف الخاصية التي تستخدم المعدل override.
مثال
في هذا المثال، الفئة Dimensions تحتوي على إحداثين اثنين x, y، و الأسلوب الظاهري Area(). فئات شكل مختلفة مثل Circle, Cylinder، و Sphere ترث الفئة Dimensions و سطح المساحة الذي يتم حسابه من أجل كل رقم. كل فئة مشتقة أنها تملك تطبيق يمنع Area(). يحسب البرنامج ويعرض المنطقة المناسبة لكل رقم بواسطة استدعاء التطبيق المناسب Area() استناداً إلى الكائن المقترنة بالأسلوب.
ولاحظ أن الفئة الموروثة فئة Circle, Sphere، و Cylinder كلها تستخدم الدالة الإنشائية لتهيّيئ الفئة الأساسية, على سبيل المثال:
public Cylinder(double r, double h): base(r, h) {}
تشبه هذه قائمة التهيئة في C++.
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
لمزيد من المعلومات، راجع مواصفات لغة #C. مواصفات اللغة هي المصدر النهائي لبناء جملة C# واستخدامها.