नहीं, आप एक गैर वर्चुअल विधि को ओवरराइड नहीं कर सकते हैं। सबसे नज़दीकी चीज जो आप कर सकते हैं वह उसी नाम से new
विधि बनाकर विधि को छिपाती है लेकिन यह सलाह नहीं दी जाती है क्योंकि यह अच्छे डिज़ाइन सिद्धांतों को तोड़ देती है।
लेकिन यहां तक कि एक विधि को छिपाने से आपको सही वर्चुअल विधि कॉल की तरह विधि कॉल के निष्पादन समय पॉलिमॉर्फिक प्रेषण नहीं मिलेगा।
using System;
class Example
{
static void Main()
{
Foo f = new Foo();
f.M();
Foo b = new Bar();
b.M();
}
}
class Foo
{
public void M()
{
Console.WriteLine("Foo.M");
}
}
class Bar : Foo
{
public new void M()
{
Console.WriteLine("Bar.M");
}
}
M
विधि प्रिंट Foo.M
के दोनों कॉल इस उदाहरण में: इस उदाहरण पर विचार। जैसा कि आप देख सकते हैं कि यह दृष्टिकोण आपको विधि के लिए एक नया कार्यान्वयन करने की अनुमति देता है जब तक कि उस ऑब्जेक्ट का संदर्भ सही व्युत्पन्न प्रकार का होता है लेकिन बेस विधि छुपाता है ब्रेक पॉलिमॉर्फिज्म करता है।
मैं अनुशंसा करता हूं कि आप इस तरीके से आधार विधियों को छिपाएं।
मैं उन लोगों के साथ पक्षपात करता हूं जो सी # के डिफ़ॉल्ट व्यवहार का पक्ष लेते हैं कि विधियां डिफ़ॉल्ट रूप से गैर-आभासी हैं (जावा के विपरीत)। मैं और भी आगे जाऊंगा और कहूंगा कि कक्षाओं को डिफ़ॉल्ट रूप से बंद कर दिया जाना चाहिए। विरासत को सही तरीके से डिजाइन करना मुश्किल है और तथ्य यह है कि एक ऐसी विधि है जो वर्चुअल होने के लिए चिह्नित नहीं है, यह इंगित करती है कि उस विधि के लेखक को कभी भी ओवरराइड करने के तरीके के लिए इरादा नहीं है।
संपादित करें: "निष्पादन समय बहुरूपी प्रेषण":
क्या मैं यह मतलब डिफ़ॉल्ट व्यवहार कि निष्पादन समय पर होता है जब आप आभासी तरीकों कहते हैं। आइए उदाहरण के लिए कहें कि मेरे पिछले कोड उदाहरण में, एक गैर वर्चुअल विधि को परिभाषित करने के बजाय, मैंने वास्तव में वर्चुअल विधि और एक सच्ची ओवरराइड विधि को परिभाषित किया था।
अगर मैं उस मामले में b.Foo
कॉल करने के लिए थे, CLR सही ढंग से वस्तु के प्रकार है कि Bar
के रूप में b
संदर्भ बिंदु और उचित रूप से M
करने के लिए कॉल प्रेषण होगा निर्धारित करेंगे।
स्रोत
2009-12-05 23:48:52
क्या आपका मतलब है * ओवरलोड * या * ओवरराइड *? अधिभार = एक ही नाम के साथ एक विधि जोड़ें लेकिन विभिन्न पैरामीटर (जैसे Console.WriteLine के विभिन्न अधिभार)। ओवरराइड = (मोटे तौर पर) विधि के डिफ़ॉल्ट व्यवहार को बदलें (उदा। एक आकार। ड्रॉ विधि जिसमें मंडल, आयत, इत्यादि के लिए अलग-अलग व्यवहार हैं)। आप हमेशा व्युत्पन्न वर्ग में एक विधि * ओवरलोड * कर सकते हैं, लेकिन * ओवरराइडिंग * केवल आभासी तरीकों पर लागू होता है। – itowlson