मन दोनों खोजशब्दों कि वे एक दूसरे के विपरीत हैं में रखना मेरे रास्ते: यहाँ है कि इस विषय के लिए एक बहुत अच्छा दृश्य है।
override
: virtual
कीवर्ड को विधि को ओवरराइड करने के लिए परिभाषित किया जाना चाहिए। override
कीवर्ड का उपयोग करने वाली विधि, संदर्भ प्रकार (बेस क्लास या व्युत्पन्न कक्षा का संदर्भ) चाहे बेस बेस के साथ तत्काल हो, बेस बेस की विधि चलती है। अन्यथा, व्युत्पन्न वर्ग की विधि चलती है।
new
: यदि कीवर्ड किसी विधि द्वारा उपयोग किया जाता है, override
कीवर्ड के विपरीत, संदर्भ प्रकार महत्वपूर्ण है। यदि यह व्युत्पन्न वर्ग के साथ तत्काल है और संदर्भ प्रकार आधार वर्ग है, तो बेस क्लास की विधि चलती है। यदि यह व्युत्पन्न वर्ग के साथ तत्काल है और संदर्भ प्रकार व्युत्पन्न वर्ग है, व्युत्पन्न वर्ग की विधि चलती है। अर्थात्, यह override
कीवर्ड का विपरीत है। एन पासेंट, यदि आप विधि में नया कीवर्ड जोड़ने के लिए भूल जाते हैं या छोड़ देते हैं, तो संकलक डिफ़ॉल्ट रूप से new
कीवर्ड के रूप में व्यवहार करता है।
class A
{
public string Foo()
{
return "A";
}
public virtual string Test()
{
return "base test";
}
}
class B: A
{
public new string Foo()
{
return "B";
}
}
class C: B
{
public string Foo()
{
return "C";
}
public override string Test() {
return "derived test";
}
}
मुख्य में कॉल:
A AClass = new B();
Console.WriteLine(AClass.Foo());
B BClass = new B();
Console.WriteLine(BClass.Foo());
B BClassWithC = new C();
Console.WriteLine(BClassWithC.Foo());
Console.WriteLine(AClass.Test());
Console.WriteLine(BClassWithC.Test());
आउटपुट:
A
B
B
base test
derived test
http://stackoverflow.com/questions/159978/c-keyword-usage-virtualoverride-vs-new –