2014-04-18 8 views
6

ठीक है मेरे पास एक व्युत्पन्न कक्षा है जिसमें मेरी बेस क्लास पर एक विधि को अधिभारित किया गया है। मैं कॉल करता हूं जो मुझे लगता है कि बेस क्लास के विधि हस्ताक्षर से मेल खाता है लेकिन इसके बजाय मेरे व्युत्पन्न वर्ग कार्यान्वयन को बुलाया जाता है। (नीचे दिया गया कोड हमेशा "MyDerived" प्रिंट करता है) यह क्यों है?गलत अधिभार चुनने वाला कंपाइलर

public class MyBase 
    { 
     public void DoSomething(int a) 
     { 
      Console.WriteLine("MyBase"); 
     } 
    } 

    public class MyDerived : MyBase 
    { 
     public void DoSomething(long a) 
     { 
      Console.WriteLine("MyDerived"); 
     } 
    } 


Main() 
{ 
    MyDerived d = new MyDerived(); 
    d.DoSomething((int)5); 
} 
+1

मैं सिर्फ एक नया कंसोल अनुप्रयोग में अपने कोड की नकल की है, और मैं हो "MyDerived" बाहर हर बार लिखा है। क्या यह सही कोड है जिसका आप उपयोग कर रहे हैं? –

+0

क्षमा करें! मेरा मतलब है कि यह MyDerived प्रिंट करता है! Typo मैं इसे अब बदल रहा हूँ! –

उत्तर

5

अधिकांश लोगों को लगता है आधार वर्ग पर DoSomething (int) अधिभार DoSomething (लंबी) अधिभार तुलना में एक बेहतर मुकाबला नहीं है।

हालांकि, क्योंकि चर एक व्युत्पन्न प्रकार है, DoSomething का संस्करण कहा जाएगा। .NET रनटाइम हमेशा सबसे अधिक व्युत्पन्न संकलन-समय प्रकार का समर्थन करता है।

यदि यह एक विधि हस्ताक्षर पाता है जो व्युत्पन्न प्रकार पर काम करेगा तो यह किसी भी बेस क्लास विधियों में जाने से पहले इसका उपयोग करेगा। सामान्य रूप से, आपको आधार वर्ग में परिभाषित ओवरलोडिंग विधियों से बचना चाहिए।

+0

तो यदि ओपी ने 'माईबेस डी = नया माईडेरिव();', तो वह "माईबेस" लिखा होगा। –

+0

@GrantWinney, हाँ यह सही है। –

5

आपके द्वारा वर्णित व्यवहार सही है। बहुत से लोग इसे उलझन में मानते हैं लेकिन यह सावधानीपूर्वक एक भंगुर बेस वर्ग विफलता को रोकने के लिए डिज़ाइन किया गया है।

अधिक जानकारी के लिए विषय पर मेरा आलेख देखें।

http://blogs.msdn.com/b/ericlippert/archive/2007/09/04/future-breaking-changes-part-three.aspx

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