new
modifier सदस्य छिपाने का कारण बनता है, जो आपके वर्ग पदानुक्रम में बहुलक संबंध को तोड़ देता है। SayHi
B
की विधि (ओवरराइड नहीं) A
(इस प्रकार कीवर्ड के रूप में "नया" शब्द का विकल्प) के रूप में माना जाता है। C
की विधि B
की ओवरराइड करता है, A
(जो छुपा रहता है) ओवरराइड करता है।
इसलिए, जब आप एक A
संदर्भ के माध्यम से एक C
उदाहरण पर SayHi
कहते हैं, क्रम में यह A
प्रकार, नहीं C
प्रकार (जो भीतर SayHi
एक 'नई' B
से विरासत में मिली विधि है) के खिलाफ हल होगा।
दूसरे हाथ पर, आप को चलाने के लिए थे, हैं:
B p = new C();
p.SayHi();
... क्या तुम करोगी उम्मीद बहुरूपी परिणाम प्राप्त: चूंकि आप एक यूज़-केस का अनुरोध:
From C
संपादित , यहां एक है। .NET Framework 2.0 में जेनेरिक की शुरूआत से पहले, सदस्य छिपाने को कभी-कभी व्युत्पन्न कक्षाओं में विरासतित विधियों के कुछ प्रकारों को बदलने के साधन के रूप में उपयोग किया जाता था (कुछ ऐसा जो आप ओवरराइड करते समय नहीं कर सकते) ताकि अधिक विशिष्ट प्रकार लौटा सकें। उदाहरण के लिए:
class ObjectContainer
{
private object item;
public object Item
{
get { return item; }
set { item = value; }
}
}
class StringContainer : ObjectContainer
{
public new virtual string Item
{
get { return base.Item as string; }
set { base.Item = value as string; }
}
}
class QuotedStringContainer : StringContainer
{
public override string Item
{
get { return "\"" + base.Item + "\""; }
}
}
ObjectContainer
वर्ग के Item
संपत्ति एक सादे object
देता है। हालांकि, StringContainer
में, इस विरासत में संपत्ति string
बदले में छिपी हुई है। इस प्रकार:
ObjectContainer oc = new StringContainer();
object o = oc.Item; // Valid, since ObjectContainer.Item is resolved
string s1 = oc.Item; // Not valid, since ObjectContainer.Item is still resolved
string s2 = ((StringContainer)oc).Item;
// Valid, since StringContainer.Item is now resolved
QuotedStringContainer
वर्ग StringContainer
, अपने string
वापसी प्रकार इनहेरिट की Item
संपत्ति को ओवरराइड करता है; हालांकि, यह अभी भीobject
से छिपा हुआ है Item
ObjectContainer
की संपत्ति को पीछे हटाना। यदि यह इस तरह से नहीं थे, वहाँ उनकी विषम वापसी प्रकार का मिलान का कोई रास्ता नहीं होगा ...
ObjectContainer oc = new QuotedStringContainer();
object o = oc.Item; // Valid, since ObjectContainer.Item is resolved
string s1 = oc.Item; // Not valid, since ObjectContainer.Item is still resolved
string s2 = ((StringContainer)oc).Item;
// Valid, since QuotedStringContainer.Item is now resolved
// (polymorphism!)
string s3 = ((QuotedStringContainer)oc).Item;
// Valid, since QuotedStringContainer.Item is now resolved
'' b' से new' में आभासी अधिभार छिपा है 'C'। 'बी' टाइप करने के लिए' p' बदलें और आपको 'सी' – asawyer
से आउटपुट दिखाई देगा प्रश्न यह है कि "इसके लिए उपयोग केस क्या है?" लेकिन वास्तविक सवाल पूछा गया है "यह ऐसा क्यों करता है?"। मैं उत्सुक हूं कि इसके लिए उपयोग का मामला क्या है - जानबूझकर विरासत को इस तरह से पराजित करना जो आपके एपीआई के उपभोक्ताओं के लिए स्पष्ट नहीं है, अविश्वसनीय रूप से खतरनाक लगता है। – Chuu
@ कुहू: धन्यवाद, मैंने स्पष्ट किया। – dotancohen