c# compiler لماذا تصبح الخاصية الموروثة من واجهة افتراضية؟



reflection (1)

بدءًا من قسم الملاحظات في مستندات MS :

يجوز للعضو الظاهري الرجوع إلى بيانات المثيل في الفصل الدراسي ويجب الرجوع إليه من خلال مثيل للفئة ... يتطلب وقت تشغيل اللغة العامة أن يتم تمييز جميع الطرق التي تنفذ أعضاء الواجهة على أنها افتراضية ؛ لذلك ، المحول البرمجي علامات الأسلوب virtual final

إذا كنت بحاجة إلى تحديد ما إذا كانت هذه الطريقة قابلة للتغلب عليها ، فإن التحقق من IsVirtual لا يكفي وتحتاج أيضًا إلى التحقق من أن IsFinal خطأ.

فيما يلي طريقة تمديد تقوم بهذا الفحص:

public static bool IsOverridable(this MethodInfo method)
    => method.IsVirtual && !method.IsFinal;

قل لدي واجهة واحدة وفئتان ، وواحدة من الطبقات تنفذ هذه الواجهة:

interface IAAA
{
    int F1 { get; set; }
}

class AAA1
{
    public int F1 { get; set; }
    public int F2 { get; set; }
}

class AAA2 : IAAA
{
    public int F1 { get; set; }
    public int F2 { get; set; }
}

في الفئة AAA2 ، تكون الخاصية F1 "موروثة" (لست متأكدًا) من الواجهة IAAA ، ثم أستخدم الانعكاس للتحقق مما إذا كانت الخاصية افتراضية:

Console.WriteLine("AAA1 which does not implement IAAA");
foreach (var prop in typeof(AAA1).GetProperties())
{
    var virtualOrNot = prop.GetGetMethod().IsVirtual ? "" : " not";
    Console.WriteLine([email protected]"{prop.Name} is{virtualOrNot} virtual");
}

Console.WriteLine("AAA2 which implements IAAA");
foreach (var prop in typeof(AAA2).GetProperties())
{
    var virtualOrNot = prop.GetGetMethod().IsVirtual ? "" : " not";
    Console.WriteLine($"{prop.Name} is{virtualOrNot} virtual");
}

الإخراج هو:

AAA1 which does not implement IAAA
F1 is not virtual
F2 is not virtual
AAA2 which implements IAAA
F1 is virtual
F2 is not virtual

أي سبب لهذا؟





reflection