Wednesday, 15 February 2012

c# - Why does this work? Method overloading + method overriding + polymorphism -


निम्न कोड में:

  सार्वजनिक सार वर्ग MyClass {सार्वजनिक सार bool MyMethod (डेटाबेस डेटाबेस, संपत्ति परिसंपत्ति, रेफरी स्ट्रिंग त्रुटि संदेश); } सार्वजनिक सील कक्षा MySubClass: MyClass {सार्वजनिक ओवरराइड बूल माइमथिप (डेटाबेस डेटाबेस, एसेटडेटेड परिसंपत्ति, रेफरी स्ट्रिंग त्रुटि संदेश) {MyMethod (डेटाबेस, परिसंपत्ति, रेफरी त्रुटि संदेश); } सार्वजनिक बूल माइमथिप (डेटाबेस डेटाबेस, एसेटबेस परिसंपत्ति, रेफरी स्ट्रिंग त्रुटि संदेश) {// काम यहां किया जाता है}}  

जहां एसेट डिटेल्स एसेटबेज का उपवर्ग है।

सी # आपके अन्य कार्यान्वयन के लिए आपकी कॉल को हल करेगा क्योंकि किसी ऑब्जेक्ट पर एक विधि को कॉल करता है, जहां उस ऑब्जेक्ट के लिए क्लास का अपना कार्यान्वयन अधिसूचित या विरासत में मिला है।

यह सूक्ष्म और कठोर-से-ढूँढें समस्याओं का कारण बन सकता है, जैसे कि आपने यहां दिखाया है। उदाहरण के लिए, इस कोड की कोशिश करें (पहले इसे पढ़िए, फिर संकलन करें और इसे निष्पादित करें) देखें कि यह क्या होता है आप इसे करने की अपेक्षा करते हैं।

  सिस्टम का उपयोग कर; नामस्थान कंसोल अनुप्रयोग 9 {सार्वजनिक वर्ग आधार {सार्वजनिक वर्चुअल शून्य टेस्ट (स्ट्रिंग) {Console.Out.WriteLine ("Base.Test (स्ट्रिंग =" + एस + ")"); }} पब्लिक क्लास वंशज: बेस {सार्वजनिक ओवरराइड शून्य टेस्ट (स्ट्रिंग्स) {Console.Out.WriteLine ("Descendant.Test (String =" + s + ")"); } सार्वजनिक शून्य टेस्ट (ऑब्जेक्ट्स) {Console.Out.WriteLine ("Descendant.Test (वस्तु =" + s + ")"); }} वर्ग कार्यक्रम {स्थैतिक शून्य मुख्य (स्ट्रिंग [] आर्ग्स) {Descendant d = new Descendant (); d.Test ( "टेस्ट"); Console.In.ReadLine (); }}}  

ध्यान दें कि यदि आप वेरिएबल के प्रकार को Base के बजाय Descendant के घोषित करते हैं, कॉल दूसरी विधि पर जाएं, इस रेखा को बदलने का प्रयास करें:

  Descendant d = new Descendant ();  

इसे करने के लिए, और पुन: चलाने:

  बेस d = नया वंशज ();  

तो, आप वास्तव में Descendant.Test (String) कॉल करने के लिए कैसे प्रबंधित करेंगे

मेरा पहला प्रयास इस तरह दिखता है: < / P>

  सार्वजनिक शून्य टेस्ट (ऑब्जेक्ट्स) {Console.Out.WriteLine ("Descendant.Test (ऑब्जेक्ट =" + s + ")"); टेस्ट ((स्ट्रिंग) रों); }  

यह मेरे लिए कोई अच्छा नहीं था, और इसके बजाय बस एक अंतिम स्टैक अतिप्रवाह के लिए टेस्ट (ऑब्जेक्ट) कहा जाता है।

लेकिन , निम्न कार्य करता है चूंकि, जब हम d चर को बेस प्रकार के होने के लिए घोषित करते हैं, तो हम सही आभासी पद्धति को बुलाते हैं, हम उस चाल को भी सहारा सकते हैं:

<पूर्व> सार्वजनिक शून्य टेस्ट (ऑब्जेक्ट्स) {Console.Out.WriteLine ("Descendant.Test (ऑब्जेक्ट =" + s + ")"); बेस बी = यह; b.Test ((स्ट्रिंग) रों); }

यह प्रिंट होगा:

  Descendant.Test (ऑब्जेक्ट = टेस्ट) Descendant.Test (स्ट्रिंग = टेस्ट)  

आप भी बाहर से ऐसा कर सकते हैं:

  Descendant d = new Descendant (); d.Test ( "टेस्ट"); बेस बी = डी; b.Test ( "टेस्ट"); Console.In.ReadLine ();  

प्रिंट होगा।

लेकिन पहले आपको इस समस्या से अवगत होने की आवश्यकता है , जो एक और बात पूरी तरह से है।


No comments:

Post a Comment