2010-05-27 8 views
6

मेरे पास एक कक्षा (कक्षा बी) है जो एक और कक्षा (कक्षा ए) प्राप्त करती है जिसमें वर्चुअल विधियां होती हैं।यह सी # कोड संदिग्ध वर्चुअल विधि होने पर ठीक क्यों संकलित करता है?

गलती से, मैं override कीवर्ड छोड़े गए जब क्लास B में एक (माना जा करने के लिए) अधिभावी विधि की घोषणा

क्लास ए

public class ClassA{ 
    public virtual void TestMethod(){ 
    } 
} 

कक्षा बी

public class ClassB : ClassA{ 
    public void TestMethod(){ 
    } 
} 

कोड बिना किसी समस्या के संकलित। क्या कोई समझा सकता है क्यों?

+1

क्या आपके पास चेतावनियां चालू हैं? – zildjohn01

+0

चेतावनी बंद कर दी गई थी - फिर से वापस :) :) – Jimbo

उत्तर

7

यह संदिग्ध नहीं है। यह कहने के लिए एक चेतावनी के साथ संकलित होना चाहिए कि आपको या तो "नया" या "ओवरराइड" निर्दिष्ट करना चाहिए और डिफ़ॉल्ट रूप से "नया" प्रभावी है।

जब मैं कहता हूं कि यह कोड संकलित करने का प्रयास करता है तो यह निश्चित रूप से चेतावनी देता है - जब आप कहते हैं कि यह "ठीक" और "बिना किसी समस्या के" संकलित करता है तो क्या आप चेतावनियों को अनदेखा कर रहे हैं?

+0

वास्तव में मेरे पास चेतावनियां प्रदर्शित नहीं की जा रही हैं - इसके लिए धन्यवाद, फिर से चेतावनियां डाल देंगे। – Jimbo

+0

इस मामले में 'नई' विधि का क्या दायरा होगा? यदि 'ओवरराइड 'पुरानी विधि को अनिवार्य रूप से रोकता है, तो उस विधि के लिए' new' को पहुंच का स्तर बनाना चाहिए? – Jimbo

+0

@ जिम्बो: मुझे यकीन नहीं है कि आप वास्तव में किस शब्दावली का उपयोग कर रहे हैं - "aborts" और "पहुंच का स्तर" वास्तव में यहां लागू नहीं हैं। लेकिन मूल रूप से यदि आप 'क्लासए' के ​​संकलन-समय प्रकार के संदर्भ में 'TestMethod' को कॉल करते हैं तो यह मूल विधि को कॉल करेगा, और यदि आप' क्लासबी 'के संकलन-समय प्रकार के संदर्भ का उपयोग करते हैं तो यह व्युत्पन्न कक्षा का उपयोग करेगा तरीका। –

0

वर्ग बी

public class ClassB : ClassA{ 
    public override void TestMethod(){ 
    } 
} 

होना चाहिए, लेकिन यह ओवरराइड बिना संकलन कर सकते हैं - यह एक चेतावनी उत्पन्न करनी चाहिए कि अगर यह इरादा था आप के लिए नए कीवर्ड

public class ClassB : ClassA{ 
    public new void TestMethod(){ 
    } 
} 

जोड़ने के लिए चेकआउट this की जरूरत अधिक जानकारी

+1

-1: उसने क्या नहीं पूछा –

+0

क्षमा करें - मैं एक मिनट में जवाब संपादित करूंगा –

1

सी # कंपाइलर एक चेतावनी उत्पन्न करता है। मैं सलाह देता हूं कि आप हमेशा 'त्रुटियों के रूप में चेतावनियों' के साथ संकलित करें।