c# इंटरफ़ेस से विरासत में मिली संपत्ति आभासी क्यों हो जाती है?



पैतृक संपत्ति बेचने पर (1)

कहें कि मेरे पास एक इंटरफ़ेस और दो कक्षाएं हैं, और एक वर्ग इस इंटरफ़ेस को लागू करता है:

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 AAA2 से 'इनहेरिटेड' (मुझे यकीन नहीं है) है, तो मैं यह देखने के लिए प्रतिबिंब का उपयोग करता हूं कि प्रॉपर्टी वर्चुअल है या नहीं:

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

इसका कोई कारण?


एमएस डॉक्स की टिप्पणी अनुभाग से :

एक आभासी सदस्य एक वर्ग में उदाहरण डेटा को संदर्भित कर सकता है और उसे कक्षा के एक उदाहरण के माध्यम से संदर्भित किया जाना चाहिए ... सामान्य भाषा रनटाइम के लिए यह आवश्यक है कि इंटरफ़ेस सदस्यों को लागू करने वाले सभी तरीकों को आभासी के रूप में चिह्नित किया जाना चाहिए; इसलिए, कंपाइलर विधि को virtual final चिह्नित करता है

यदि आपको यह निर्धारित करने की आवश्यकता है कि क्या यह विधि अधिक है या नहीं, तो IsVirtual की जाँच IsVirtual पर्याप्त नहीं है और आपको यह भी जाँचने की आवश्यकता है कि IsFinal गलत है।

यहाँ एक विस्तार विधि है जो यह जाँच करती है:

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




reflection