मैं कंक्रीट कार्यान्वयन के बजाय डिफ़ॉल्ट विधि कैसे कह सकता हूं


9

डिफ़ॉल्ट इंटरफ़ेस विधियों का व्यवहार C # 8 में क्यों बदला गया है? पिछले कोड में (जब डिफ़ॉल्ट इंटरफ़ेस विधियों को जारी नहीं किया गया था):

interface IDefaultInterfaceMethod
{
    // By default, this method will be virtual, and the virtual keyword can be here used!
    virtual void DefaultMethod()
    {
        Console.WriteLine("I am a default method in the interface!");
    }

}

interface IOverrideDefaultInterfaceMethod : IDefaultInterfaceMethod
{
    void IDefaultInterfaceMethod.DefaultMethod()
    {
        Console.WriteLine("I am an overridden default method!");
    }
}

class AnyClass : IDefaultInterfaceMethod, IOverrideDefaultInterfaceMethod
{
}

class Program
{
    static void Main()
    {
        IDefaultInterfaceMethod anyClass = new AnyClass();
        anyClass.DefaultMethod();

        IOverrideDefaultInterfaceMethod anyClassOverridden = new AnyClass();
        anyClassOverridden.DefaultMethod();
    }
}

निम्नलिखित आउटपुट है:

कंसोल आउटपुट:

मैं इंटरफ़ेस में एक डिफ़ॉल्ट विधि हूँ!
मैं एक ओवरराइड डिफ़ॉल्ट विधि हूँ!

लेकिन C # 8 अंतिम संस्करण के साथ उपरोक्त कोड निम्नलिखित आउटपुट का उत्पादन कर रहा है:

कंसोल आउटपुट:

मैं एक ओवरराइड डिफ़ॉल्ट विधि हूँ!
मैं एक ओवरराइड डिफ़ॉल्ट विधि हूँ!

कोई मुझे समझा सकता है कि यह व्यवहार क्यों बदला है?

ध्यान दें:

IDefaultInterfaceMethod anyClass = new AnyClass(); anyClass.DefaultMethod();

((IDefaultInterfaceMethod) anyClass).DefaultMethod(); // STILL the same problem!??

2
C # 8 से पहले कोई डिफ़ॉल्ट इंटरफ़ेस तरीके नहीं थे । दूसरा आउटपुट अपेक्षित मामला है - जब आप एक इंटरफ़ेस विधि लागू करते हैं, तो आप उम्मीद करते हैं कि कॉल किया जाएगा। क्या आप एक पुराने विनिर्देशन का जिक्र कर रहे हैं? मुझे उम्मीद है कि इसे छोड़ दिया गया था क्योंकि यह एक इंटरफ़ेस विधि के अपेक्षित व्यवहार को तोड़ता है
पनियागोटिस कानवास

3
एक बेहतर सवाल यह होगा कि "मैं कंक्रीट कार्यान्वयन के बजाय डिफ़ॉल्ट विधि कैसे कह सकता हूं?" जिसका उत्तर "आप अभी तक नहीं दे सकते हैं, क्योंकि आधार .efaultMethod () सिंटैक्स C # 8 से हटा दिया गया था"
पनागोटियोटिस कानवोस

4
यहाँ डिज़ाइन मीटिंग पेज है जहाँ आधार कॉल पर चर्चा की गई और C # 8 के लिए छोड़ दिया गया Cut base() syntax for C# 8. We intend to bring this back in the next major release.। इसे ठीक से काम करने के लिए रनटाइम समर्थन की आवश्यकता होगी।
पनियागोटिस कानवास

3
एक इंटरफ़ेस हमेशा एक इंटरफ़ेस होता है। जब मैं एक इंटरफ़ेस विधि लागू करता हूं तो मुझे उम्मीद है कि सभी ग्राहक कार्यान्वित विधि को कॉल करेंगे। ग्राहकों को परवाह नहीं करनी चाहिए कि कौन सी कक्षा विधि को लागू करती है - उन्हें एक इंटरफ़ेस मिला और वे इसे कहते हैं।
पनियागोटिस कानावोस

2
आपके द्वारा पोस्ट किए गए सिंटैक्स के लिए, यह वास्तव में पुराने प्रस्ताव से होना चाहिए - डीआईएम को केवल स्पष्ट रूप से कहा जा सकता है, जैसे स्पष्ट रूप से इंटरफेस। हालांकि यह प्रस्ताव स्पष्ट इंटरफ़ेस सिंटैक्स का उपयोग करता है ... क्या मुझे लगता है कि इसके विपरीत है virtual? और संभवतः एक विरासत हीरे को पेश करते हुए
पनियागोटिस कानवास

जवाबों:


6

मुझे संदेह है कि एक बेहतर प्रश्न होगा:

मैं कंक्रीट कार्यान्वयन के बजाय डिफ़ॉल्ट विधि कैसे कह सकता हूं?

सुविधा की योजना बनाई गई थी, लेकिन अप्रैल 2019 में C # 8 से काट दिया गया था , क्योंकि एक कुशल कार्यान्वयन को रनटाइम से समर्थन की आवश्यकता होगी। यह रिलीज से पहले समय में जोड़ा नहीं जा सका। इस सुविधा को C # और VB.NET दोनों के लिए अच्छा काम करना होगा - F # को वैसे भी इंटरफेस पसंद नहीं है।

यदि BM रन टाइम पर मौजूद नहीं है, तो AM () को कॉल किया जाएगा। आधार () और इंटरफेस के लिए, यह रनटाइम द्वारा समर्थित नहीं है, इसलिए कॉल इसके बजाय अपवाद फेंक देगा। हम रनटाइम में इसके लिए समर्थन जोड़ना चाहते हैं, लेकिन यह रिलीज़ करना बहुत महंगा है।

हमारे पास कुछ वर्कअराउंड हैं, लेकिन उनके पास वह व्यवहार नहीं है जो हम चाहते हैं, और पसंदीदा कोडगेन नहीं हैं।

C # के लिए हमारा कार्यान्वयन कुछ हद तक व्यावहारिक है, हालांकि वास्तव में हम जो चाहेंगे, लेकिन VB कार्यान्वयन अधिक कठिन नहीं होगा। इसके अलावा, वीबी के लिए कार्यान्वयन के लिए इंटरफ़ेस कार्यान्वयन के तरीकों को सार्वजनिक एपीआई सतह की आवश्यकता होगी।

यह कॉल के माध्यम सेbase() काम करेगा कि कक्षाएं कैसे काम करती हैं। प्रस्ताव उदाहरण का समर्थन:

interface I1
{ 
    void M(int) { }
}

interface I2
{
    void M(short) { }
}

interface I3
{
    override void I1.M(int) { }
}

interface I4 : I3
{
    void M2()
    {
        base(I3).M(0) // What does this do?
    }
}

मैं उत्तर को चिह्नित करने से पहले थोड़ी देर के लिए इसे छोड़ दूंगा। शायद आपको अपने अच्छे काम के लिए कुछ अप-वोट मिलेंगे :-) धन्यवाद!
बासम आलगिली

1
@ बस्समअल्लुजी केवल इसलिए कि किसी ने एक महीने पहले ऐसा ही कुछ पूछा था। वापस फिर मैं हालांकि Why would you do that?। फिर मुझे मीटिंग के मिनटों का पता चला
पनियागोटिस कानवास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.