से छिपाने, ओवरराइडिंग और कॉलिंग फ़ंक्शन मैं सी # सीख रहा हूं और मुझे निम्न समस्या का सामना करना पड़ा। आधार और व्युत्पन्न:सी # बेस क्लास
class MyBase
{
public void MyMethod()
{
Console.WriteLine("MyBase::MyMethod()");
}
}
class MyDerived: MyBase
{
public void MyMethod()
{
Console.WriteLine("MyDerived::MyMethod()");
}
}
अभी के लिए, virtual
बिना और override
प्रमुख शब्दों मैं दो वर्गों की है। जब मैं इसे संकलित करता हूं तो मुझे चेतावनी मिलती है (जो निश्चित रूप से अपेक्षित है) कि मैं MyBase
कक्षा से छिपाने की कोशिश करता हूं।
मैं क्या करना चाहता हूं बेस क्लास से विधि को व्युत्पन्न कक्षा का उदाहरण रखने के लिए कॉल करना है। मैं इस तरह ऐसा करते हैं:
MyDerived myDerived = new MyDerived();
((MyBase)myDerived).MyMethod();
यह ठीक काम करता है जब मैं किसी भी virtual
तरीकों में कीवर्ड निर्दिष्ट नहीं करते हैं, आदि। मैं कीवर्ड के संयोजन डालने की कोशिश की और मैं निम्नलिखित परिणाम मिल गया:
| MyBase::MyMethod | MyDerived::MyMethod | Result printed on the console |
| -----------------|---------------------|-------------------------------|
| - | - | MyBase::MyMethod() |
| - | new | MyBase::MyMethod() |
| virtual | new | MyBase::MyMethod() |
| virtual | override | MyDerived::MyMethod() |
मुझे आशा है कि तालिका आप के लिए स्पष्ट है।
- यह सही तरीका आधार वर्ग (
((MyBase)myDerived).MyMethod();
) से समारोह कॉल कर सकता: मैं दो प्रश्न है? मुझेbase
कीवर्ड के बारे में पता है, लेकिन इसे केवल व्युत्पन्न वर्ग के अंदर से ही बुलाया जा सकता है। क्या यह सही है? - आखिरी मामले में क्यों (
virtual
औरoverride
संशोधक के साथ) विधि जिसे व्युत्पन्न वर्ग से बुलाया गया था? क्या आप कृपया इसे समझाएंगे?
क्या आप कृपया जो चाहते हैं उस पर विस्तार से बता सकते हैं और क्या आपने अनुभव किया? मैं बस इतना कह सकता हूं कि "हाँ, यह सही दिखता है"। अंतिम प्रश्न के लिए आपको वास्तव में वर्चुअल विधि प्रेषण कार्य करने के तरीके पर पढ़ना चाहिए। जानकारी के लिए http://en.wikipedia.org/wiki/Virtual_method_table देखें। –