2012-04-02 12 views
7

मैं निम्नलिखित सरल कोडअतिरंजित विधि को कॉल करने के लिए कैसे ओवरलोड किया गया है?

abstract class A 
{ 
    public abstract void Test(Int32 value); 
} 

class B : A 
{ 
    public override void Test(Int32 value) 
    { 
     Console.WriteLine("Int32"); 
    } 

    public void Test(Double value) 
    { 
     Test((Int32)1); 
    } 
} 

मुझे इस कोड की लाइन टेस्ट भाग गया ((Int32) 1) अनंत प्रत्यावर्तन के कारण ढेर अतिप्रवाह का कारण बनता है की है। केवल संभव तरीके से सही ढंग से उचित विधि (पूर्णांक पैरामीटर के साथ) कॉल करने के लिए मैंने पाया

(this as A).Test(1); 

है लेकिन यह मेरे लिए उचित नहीं है, क्योंकि दोनों तरीकों टेस्ट सार्वजनिक कर रहे हैं और मैं तैयार उन दोनों कॉल करने के लिए सक्षम होने के लिए कर रहा हूँ तरीका?

उत्तर

4

दुर्भाग्यवश A::Test(int) को B संदर्भ के माध्यम से कॉल करने के लिए कुछ प्रकार की कास्ट की आवश्यकता है। जब तक सी # कंपाइलर B के माध्यम से संदर्भ देखता है तो यह B::Test(double) संस्करण चुन देगा।

एक थोड़ा कम बदसूरत संस्करण निम्न

((A)this).Test(1); 

एक और सोचा है, हालांकि एक अलग नाम है कि दोनों में फ़ीड के साथ एक निजी विधि है। जैसा कि आप उम्मीद कर सकते हैं सी # में

class B : A { 
    public override void Test(int i) { 
    TestCore(i); 
    } 
    public void Test(double d) { 
    TestCore(1); 
    } 
    private void TestCore(int i) { 
    // Combined logic here 
    } 
} 
5

विधि अधिभार संकल्प हमेशा व्यवहार नहीं करता है, लेकिन अपने कोड विनिर्देश के अनुसार बर्ताव कर रही है (मैं a blog post इस बारे में लिखा था थोड़ी देर पहले)।

संक्षेप में, संकलक

  • प्रकार घोषित किये गए हैं (अपने मामले Test में) तरीकों कि

    • एक ही नाम है खोजने या इसके आधार में से एक (अपने मामले B में) द्वारा शुरू प्रकार
    • ओवरराइड संशोधक

    ध्यान दें कि अंतिम बिंदु के साथ घोषित नहीं कर रहे हैं। यह वास्तव में तार्किक है, क्योंकि वर्चुअल विधियों को रन-टाइम में हल किया जाता है, समय संकलित नहीं किया जाता है।

    अंत में, यदि प्रकार (इस मामले में B) में एक विधि है जो एक उम्मीदवार है (जिसका अर्थ है कि आपके कॉल में पैरामीटर को उम्मीदवार विधि के पैरामीटर प्रकार में पूर्ण रूप से परिवर्तित किया जा सकता है), उस विधि का उपयोग किया जाएगा । आपकी ओवरराइड विधि निर्णय प्रक्रिया का हिस्सा भी नहीं है।

    यदि आप अपनी ओवरराइड विधि को कॉल करना चाहते हैं, तो आपको ऑब्जेक्ट को इसके मूल प्रकार पर पहले डालना होगा।

  • संबंधित मुद्दे