2010-03-16 13 views
5

यहाँ एक और बुनियादी सवाल हाल ही मेंबहुरूपता और ग #

class A { 
    public virtual void Method1(){} 

    public void Method2() { 
     Method1(); 
    } 
} 

class B:A { 
    public override void Method1() { } 
} 

class main { 
    A obk = new B(); 
    obk.Method2(); 
} 

एमएस साक्षात्कार में पूछा तो जो समारोह कहा जाता हो जाता है? टाइपो के लिए खेद है।

+22

आप इसे अभी क्यों नहीं देखते हैं? –

+0

@ जेफ: इससे कोई फर्क नहीं पड़ता; B.Method1() अभी भी फ़ंक्शन है जिसे कॉल किया जाता है। – apandit

+0

मुझे लगता है कि वीएमटी (विटुअल विधि तालिका) के अनुसार ओवरराइड विधि का सबसे हालिया संस्करण कहलाता है। तो यह बीएम विधि 1() हो सकता है – TalentTuner

उत्तर

12
B.Method1(); 

कहा जाता हो जाता है, क्योंकि यह ठीक से आभासी विधि A.Method1();

5

ओवरराइड करता है इस मामले B.Method1 कहा जाता हो जाता है। ऐसा इसलिए है क्योंकि चर को A के रूप में टाइप किया गया है, उदाहरण के वास्तविक प्रकार B है। सीएलआर पॉलीमोर्फिक रूप से उदाहरण के वास्तविक प्रकार के आधार पर Method1 पर कॉल भेजता है, न कि चर के प्रकार।

2

बीएम विधि 1() को ओवरराइड के कारण बुलाया जाता है।

3

नियम "सबसे व्युत्पन्न वर्ग में सदस्य ओवरराइडिंग" है, जो इस मामले में "बी" होगा।

4

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

class Program 
{ 
    static void Main(string[] args) 
    { 
     var b = new B(); 
     b.Method2(); 

     Console.ReadLine(); 
    } 
} 

class A 
{ 

    public virtual void Method1() 
    { 
     Console.WriteLine("Method1 in class A"); 
    } 

    public void Method2() 
    { 
     Method1(); 
    } 
} 

class B : A 
{ 
    public override void Method1() 
    { 
     Console.WriteLine("Method1 in class B"); 
    } 
} 
1

B.Method1 कहा जाता है।

1

सवाल एक छोटे से ambigious है ... लेकिन ...

obk.method2() कहा जाता है। बदले में, यह obk.Method1 को कॉल करता है, जो कि बी के उदाहरण के बाद से बीएम विधि 1 द्वारा ओवरराइड किया गया है। तो B.Method1 अंत में क्या कहा जाता है।

0

जैसा कि सभी ने कहा है, बीएम विधि 2 बुलाया जाता है।

((A)B).Method2(); 
B.Method2(); 

ये दोनों फोन करेगा B.Method1(), क्योंकि यह ठीक से ओवरराइड की गई थी: यहाँ जानकारी के कुछ अन्य टुकड़े, ताकि आप समझ क्या हो रहा है है। ए के विधि 1 को कॉल करने के लिए, एक आधार होना चाहिए। बी से बना Method1() कॉल (जो प्रायः बीएम विधि 1 के कार्यान्वयन में हमेशा नहीं किया जाता है)।

अगर, हालांकि, बी इस तरह से परिभाषित किया गया था:

class B:A { 
new public void Method1() { } 

... तो एक के Method1() क्योंकि Method1 वास्तव में अधिरोहित नहीं किया गया था कहा जाता है, यह छिपा हुआ था और दूर tucked बहुरूपता के नियमों के बाहर। आम तौर पर, यह आमतौर पर करने के लिए एक बुरी चीज है। हमेशा नहीं, लेकिन सुनिश्चित करें कि आप अच्छी तरह से जानते हैं कि आप क्या कर रहे हैं और आप ऐसा क्यों कर रहे हैं यदि आप कभी ऐसा कुछ करते हैं।

फ्लिप पक्ष पर, नया का उपयोग करके इस तरह से कुछ दिलचस्प साक्षात्कार प्रश्न भी मिलते हैं।

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