new
का अर्थ है अपने संदर्भ प्रकार (बाएं हाथ की ओर =
) का सम्मान करें , जिससे संदर्भ प्रकार की विधि चल रही है। यदि पुनर्निर्धारित विधि में new
कीवर्ड नहीं है , तो यह व्यवहार किया जाता है जैसे कि यह है। इसके अलावा, इसे गैर-बहुरूपी विरासत के रूप में भी जाना जाता है । यही है, "मैं व्युत्पन्न वर्ग में एकदम नया तरीका बना रहा हूं, जिसका आधार वर्ग में समान नाम से किसी भी तरीके से कोई लेना-देना नहीं है।" - कहा व्हिटकर ने
override
, जिसका उपयोग virtual
इसके आधार वर्ग में कीवर्ड के साथ किया जाना चाहिए , का अर्थ है अपने OBJECT प्रकार (दाएं-हाथ की ओर =
) का सम्मान करें , जिससे संदर्भ प्रकार की परवाह किए बिना पद्धति ओवरराइड हो। इसके अलावा, यह बहुरूपी विरासत के रूप में भी जाना जाता है ।
दोनों खोजशब्दों को ध्यान में रखने का मेरा तरीका है कि वे एक दूसरे के विपरीत हैं।
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
नया कोड उदाहरण,
एक-एक करके टिप्पणी करके कोड के साथ खेलें।
class X
{
protected internal /*virtual*/ void Method()
{
WriteLine("X");
}
}
class Y : X
{
protected internal /*override*/ void Method()
{
base.Method();
WriteLine("Y");
}
}
class Z : Y
{
protected internal /*override*/ void Method()
{
base.Method();
WriteLine("Z");
}
}
class Programxyz
{
private static void Main(string[] args)
{
X v = new Z();
//Y v = new Z();
//Z v = new Z();
v.Method();
}