2009-11-20 20 views
5
public abstract class A 
{ 
    public abstract void Process(); 
} 

public abstract class B : A 
{ 
    public abstract override void Process(); 
} 

public class C : B 
{ 
    public override void Process() 
    { 
     Console.WriteLine("abc"); 
    } 
} 

यह कोड संकलन त्रुटि को फेंकता है: 'बी' विरासत में अमूर्त सदस्य 'एप्रोसेस()' को लागू नहीं करता है।एक अमूर्त विधि एक अमूर्त विधि ओवरराइड करता है

क्या ऐसा करने का कोई तरीका है?

+0

आप क्यों चाहेंगे? –

+0

आप वास्तव में क्या करने की कोशिश कर रहे हैं? आपका कोड बहुत समझ में नहीं आता है ... –

उत्तर

13

कक्षा बी में पूरी तरह से विधि को छोड़ दें बी बी को ए से भी विरासत में मिला है, और चूंकि बी स्वयं ही सार है, इसलिए आपको इसे फिर से लागू करने की आवश्यकता नहीं है।

8

वीएस 2008 में मेरे लिए काम करता है; कोई त्रुटि नहीं, कोई चेतावनी नहीं। -

यह कोई मतलब नहीं है

public abstract class A 
{ 
    public abstract void Process(); 
} 

public abstract class B : A 
{ 
} 

public class C : B 
{ 
    public override void Process() 
    { 
     Console.WriteLine("abc"); 
    } 
} 
3

एलन: लेकिन, वहाँ कोई इस कोड को बराबर है बी में 'ओवरराइड' के लिए कारण नहीं है। सबसे पहले, यह वास्तव में ठीक संकलित करता है। मार्क

3

जगह मैं कहाँ '- दूसरे, सार विधि आप एक में घोषित (अभी भी सार) विरासत में मिला है बी में इसलिए, आप वर्ग बी में प्रक्रिया() घोषित करने के लिए

कोई आवश्यकता नहीं मैंने देखा है कि कभी-कभी एक अमूर्त विधि के साथ एक गैर-सारणी वर्चुअल विधि को ओवरराइड कर रहा है। उदाहरण के लिए:

public abstract class SomeBaseType 
{ 
    /* Override the ToString method inherited from Object with an abstract 
    * method. Non-abstract types derived from SomeBaseType will have to provide 
    * their own implementation of ToString() to override Object.ToString(). 
    */ 
    public abstract override string ToString(); 
} 

public class SomeType : SomeBaseType 
{ 
    public override string ToString() 
    { 
     return "This type *must* implement an override of ToString()"; 
    } 
} 
+0

मुझे लगता है कि मुझे पता है कि आपका क्या मतलब है लेकिन आपका उदाहरण आप जो कह रहे हैं उसे प्रतिबिंबित नहीं करता है। कम से कम आपको गैर-वर्चुअल वर्चुअल विधि के साथ एक SomeVeryBaseType क्लास जोड़ना चाहिए और कुछ BaseType को SomVeryBaseType से प्राप्त करना चाहिए। –

+0

उन डमी के लिए जो नहीं जानते हैं या प्राप्त करते हैं ... मेरे जैसे –

+0

@Lieven: मैंने यह स्पष्ट करने के लिए एक टिप्पणी जोड़ा कि यहां मूल विधि को ओवरराइड किया जा रहा है 'Object.ToString() '। –

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