अच्छे प्रश्न हैं। मैं उन्हें फिर से बताऊं।
किसी विधि को किसी अन्य विधि से छिपाना क्यों कानूनी है?
उस प्रश्न का उत्तर एक उदाहरण से देता हूं। आपके पास CLR v1 से एक इंटरफ़ेस है:
interface IEnumerable
{
IEnumerator GetEnumerator();
}
उत्तम। अब CLR में v2 आप जेनरिक है और आपको लगता है "आदमी, अगर v1 में केवल हम था था जेनरिक मैं इस एक सामान्य इंटरफ़ेस बना सकता था। लेकिन मैं नहीं। मैं अब इसके साथ संगत कुछ है कि बनाना चाहिए था है सामान्य ताकि मुझे कोड के साथ पीछे की संगतता खोने के बिना जेनरिक का लाभ मिलता है जो IEnumerable की अपेक्षा करता है। "
interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> .... uh oh
क्या आप GetEnumerator विधि को कॉल करने जा रहे हैं IEnumerable<T>
? याद रखें, आप चाहते हैं कि यह गैर-जेनेरिक आधार इंटरफेस पर गेटइन्यूमर को छिपा दे। आप कभी भी उस चीज को नहीं चाहते हैं जब तक कि आप स्पष्ट रूप से एक बैकवर्ड-कॉम्पिटिशन की स्थिति में न हों।
यह अकेला विधि छिपाने का औचित्य सिद्ध करता है। पद्धति छिपाने के औचित्य पर अधिक विचार के लिए विषय पर मेरा लेख देखें ।
"नया" के बिना छिपाना एक चेतावनी का कारण क्यों बनता है?
क्योंकि हम इसे आपके ध्यान में लाना चाहते हैं कि आप कुछ छिपा रहे हैं और हो सकता है कि यह गलती से हो रहा हो। याद रखें, हो सकता है कि आप किसी गलती से किसी और के द्वारा किए गए आधार वर्ग को संपादित करने के बजाय गलती से कुछ छिपा रहे हों, बजाय इसके कि आप अपने व्युत्पन्न वर्ग को संपादित करें।
एक त्रुटि के बजाय "नया" चेतावनी के बिना क्यों छिपाया जाता है?
इसी कारण से। हो सकता है कि आप गलती से कुछ छिपा रहे हों, क्योंकि आपने बस एक बेस क्लास का नया संस्करण उठाया है। यह हमेशा होता है। FooCorp एक बेस क्लास बनाता है। B. BarCorp एक व्युत्पन्न क्लास D को एक मेथड बार के साथ बनाता है, क्योंकि उनके ग्राहक उस तरीके को पसंद करते हैं। फूकोर्प देखता है और कहता है कि, यह एक अच्छा विचार है, हम उस कार्यक्षमता को आधार वर्ग पर रख सकते हैं। वे ऐसा करते हैं और Foo.DLL का एक नया संस्करण शिप करते हैं, और जब BarCorp नया संस्करण चुनता है, तो अच्छा होगा यदि उन्हें बताया जाए कि उनका तरीका अब बेस क्लास पद्धति को छुपाता है।
हम चाहते हैं कि स्थिति एक चेतावनी हो और त्रुटि न हो क्योंकि इसे त्रुटि बनाने का अर्थ है कि यह भंगुर आधार वर्ग समस्या का एक और रूप है । C # को सावधानीपूर्वक डिज़ाइन किया गया है ताकि जब कोई बेस क्लास में बदलाव करे, तो एक व्युत्पन्न क्लास का उपयोग करने वाले कोड पर प्रभाव कम से कम हो।
क्यों छुपा है और डिफ़ॉल्ट को ओवरराइड नहीं कर रहा है?
क्योंकि वर्चुअल ओवरराइड खतरनाक है । वर्चुअल ओवरराइड, व्युत्पन्न वर्गों को कोड के व्यवहार को बदलने की अनुमति देता है जिसे आधार कक्षाओं का उपयोग करने के लिए संकलित किया गया था। ओवरराइड बनाने की तरह कुछ खतरनाक करना ऐसा कुछ होना चाहिए जो आप जानबूझकर और जानबूझकर करते हैं , न कि दुर्घटना से।