2013-04-08 12 views
8

को मतलब नहीं है सब बुला उदाहरणों में से क्रम प्रकार, इसलिए डी है) एफ (के सभी आमंत्रण एफ() विधि डीइस कोड ब्लॉक के उत्पादन में मुझे

में
using System; 
class A 
{ 
    public virtual void F() { Console.WriteLine("A.F"); } 
} 
class B: A 
{ 
    public override void F() { Console.WriteLine("B.F"); } 
} 
class C: B 
{ 
    new public virtual void F() { Console.WriteLine("C.F"); } 
} 
class D: C 
{ 
    public override void F() { Console.WriteLine("D.F"); } 
} 
class Test 
{ 
    static void Main() { 
     D d = new D(); 
     A a = d; 
     B b = d; 
     C c = d; 
     a.F(); 
     b.F(); 
     c.F(); 
     d.F(); 
    } 
} 
घोषित किया जाना चाहिए

उत्पादन होता है:

B.F 
B.F 
D.F 
D.F 

उत्पादन नहीं चाहिए:

D.F 
D.F 
D.F 
D.F 
+0

आपको समस्या का शीर्षक बहुत अधिक समस्या – MarcinJuraszek

उत्तर

1

आप वर्ग सी में new public virtual void F() उपयोग कर रहे हैं: बी। इसका मतलब है कि कक्षा C में F() और B में F() अलग-अलग विधि हैं।

तो जब आप वर्ग D करने के लिए C ओवरराइड, वर्ग D में विधि F() वर्ग C, नहीं B से ओवरराइट कर रहा है।

एक और स्पष्ट उदाहरण इस तरह हो सकता है:

C c = new C(); 
    B b = c; 
    b.F(); 
    c.F(); 
+0

पर संपादित करना चाहिए, लेकिन सभी कॉलिंग उदाहरणों का रनटाइम प्रकार डी है, जिसका अर्थ है कि डी में एफ() का कार्यान्वयन वह है जिसे बुलाया जाता है। –

+0

विधि 'एफ() 'विधि को ओवरराइड करने तक बिल्कुल ठीक नहीं है। यदि आप इसके बजाय 'नया' का उपयोग करते हैं, तो इसे एक नई विधि के रूप में संभाला जाएगा, एक ओवरराइड – Fendy

+0

नहीं मिला! और क्योंकि रनटाइम पर कॉलर प्रकार के निकटतम कार्यान्वयन, इस मामले में ए (एफ) के लिए बी में एफ(); बी.एफ(); और सी (एफ) के लिए डी में एफ(); डीएफ() ;, कहा जाता है। –

7

Versioning with the Override and New Keywords (C# Programming Guide)

व्युत्पन्न वर्ग में विधि नए कीवर्ड के साथ पहले किया जाता है, विधि से स्वतंत्र होने के रूप में परिभाषित किया गया है बेस कक्षा में विधि।

तो A और B से you'r F तरीकों नहीं C और D से इन के साथ जुड़े रहे हैं, और यही कारण है कि आप क्या मिलता है मिलता है।

रनटाइम पर सीएलआर virtual विधि कार्यान्वयन के लिए दिखता है जिसका प्रयोग प्रकारों से शुरू होने के लिए किया जाना चाहिए, यह वास्तव में टाइप करने के लिए घोषित किया गया है। a.F() और b.F() के लिए यह B.F() घोषणा पर रोकता है, क्योंकि C.F() एक अलग विधि है (new की वजह से)।

1

यह नहीं करना चाहिए ...

A a = d; 

इसका मतलब है आप प्रकार A के एक वर्ग बना रहे हैं। और चूंकि आप वर्ग B में संबंधित विधि को स्पष्ट रूप से ओवरराइड कर रहे हैं; AB कक्षा में विधि को नियोजित करता है।

दूसरी ओर, इस पंक्ति में;

new public virtual void F() { Console.WriteLine("C.F"); } 

आप की घोषणा कर रहे हैं कि आप new कीवर्ड का उपयोग करके आधार से F() विधि का उपयोग नहीं होगा।

आप D और C कक्षाओं में F() विधि ओवरराइड था, सब उदाहरण F() विधि D वर्ग में घोषित बुलाया गया होता।

संबंधित मुद्दे