मुझे यह समझना शुरू हो गया है कि मुझे समझ में नहीं आता कि क्या हो रहा है।विरासत कक्षाओं में अधिभार विधियां
public class Base
{
public void Method(D a)
{
Console.WriteLine("public void Method(D a)");
}
}
public class Derived: Base
{
public void Method(B a)
{
Console.WriteLine("public void Method(B a)");
}
}
public class B { }
public class D: B { }
class Program
{
static void Main(string[] args)
{
Derived derived = new Derived();
D d = new D();
derived.Method(d);
}
}
यह प्रिंट होगा
public void Method(B a)
बजाय
public void Method(D a)
यह आश्चर्य की बात है: वहाँ सी # में निम्नलिखित व्यवहार है। मुझे लगता है कि इस व्यवहार का कारण विधियों की तालिका का कार्यान्वयन है। यदि सीएलआर वर्तमान प्रकार में संबंधित विधि पाता है तो सीएलआर बेस क्लास में विधियों की खोज नहीं करता है। मुझे लगता है कि वे प्रदर्शन में सुधार करने की कोशिश कर रहे थे।
लेकिन मैं निम्न कोड के साथ पूरी तरह से निराश था:
public class Base
{
public virtual void Method(D a)
{
Console.WriteLine("public void Method(D a)");
}
}
public class Derived: Base
{
public override void Method(D a)
{
Console.WriteLine("public override void Method(D a)");
}
public void Method(B a)
{
Console.WriteLine("public void Method(B a)");
}
}
public class B { }
public class D: B { }
class Program
{
static void Main(string[] args)
{
Derived derived = new Derived();
D d = new D();
derived.Method(d);
}
}
और यह
public void Method(B a)
public override void Method(D a)
यह भयानक और बहुत unpred है प्रिंट होगा ictable।
क्या कोई इसे समझा सकता है?
मुझे लगता है कि विधि तालिका में विधियों को केवल वर्तमान प्रकार में लागू किया गया है (ओवरराइडिंग विधियों को छोड़कर) और सीएलआर किसी भी विधि के रूप में जल्द ही संबंधित विधि की तलाश में बंद हो जाता है। क्या मैं सही हू?
विधि तालिका में यह विशिष्ट प्रकार में हस्ताक्षर के साथ विधि की तलाश कर रहा है जिस पर विधि कहा जाता है और यह एक मैच पाता है क्योंकि डी भी विरासत के अनुसार बी है, और यह ओवर्रिडेन विधि –
@EhsanSajjad प्रश्न की उपेक्षा कर रहा है है * क्यों * यह दूसरे पर अधिभार चुन रहा है। दोनों वैध विधि कॉल हैं, लेकिन संकलक दूसरे पर एक चुनता है। – Servy
'सीएलआर जैसे ही किसी भी विधि को बुलाया जा सकता है, संबंधित विधि की तलाश करना बंद कर देता है। क्या मैं सही हूँ? इसका सीएलआर से कोई लेना देना नहीं है। यह सी # चश्मा के आधार पर सी # कंपाइलर द्वारा पूरी तरह से संकलित समय निर्णय है, रनटाइम द्वारा किए गए निर्णय नहीं। – Servy