नहीं, आप एक गैर-आभासी विधि को ओवरराइड नहीं कर सकते। निकटतम कार्य जो आप कर सकते हैं 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
। जैसा कि आप देख सकते हैं कि यह तरीका आपको किसी विधि के लिए एक नया कार्यान्वयन करने की अनुमति देता है, जब तक कि उस वस्तु का संदर्भ सही व्युत्पन्न प्रकार का नहीं है, लेकिन आधार विधि को छिपाने से बहुरूपता टूट जाता है।
मैं आपको सलाह दूंगा कि आप इस तरीके से आधार के तरीकों को न छुपाएं।
मैं उन लोगों के साथ पक्ष रखता हूं जो C # के डिफ़ॉल्ट व्यवहार का पक्ष लेते हैं जो कि डिफ़ॉल्ट रूप से गैर-आभासी हैं (जैसा कि जावा के विपरीत है)। मैं और भी आगे जाऊंगा और कहूंगा कि कक्षाएं भी डिफ़ॉल्ट रूप से सीलबंद होनी चाहिए। इनहेरिटेंस को ठीक से डिजाइन करना मुश्किल है और यह तथ्य कि एक ऐसी विधि है जिसे वर्चुअल नहीं चिह्नित किया गया है, यह दर्शाता है कि उस विधि के लेखक ने कभी भी इस विधि का उपयोग करने का इरादा नहीं किया है।
संपादित करें: "निष्पादन समय बहुरूपता प्रेषण" :
इसका मतलब मैं यह है कि जब आप आभासी तरीके कहते हैं, तो निष्पादन समय पर होने वाला डिफ़ॉल्ट व्यवहार है। उदाहरण के लिए मान लें कि मेरे पिछले कोड उदाहरण में, एक गैर-आभासी पद्धति को परिभाषित करने के बजाय, मैंने वास्तव में एक आभासी विधि और एक सच्ची ओवरराइड विधि को परिभाषित किया था।
अगर मुझे b.Foo
उस स्थिति में कॉल करना था, तो सीएलआर सही प्रकार से उस वस्तु का निर्धारण करेगा जो b
संदर्भ को इंगित करता है Bar
और M
उचित रूप से कॉल को भेज देगा ।