2012-11-27 21 views
5

मैं नीचे की तरह एक विरासत स्कीमा है विरासत:एक अमूर्त वर्ग एक और अमूर्त वर्ग मुद्दा

public abstract class BaseAttachment 
{ 
    public abstract string GetName(); 
} 

public abstract class BaseFileAttachment:BaseAttachment 
{ 
    public abstract string GetName(); 
} 

public class ExchangeFileAttachment:BaseFileAttachment 
{ 
    string name; 
    public override string GetName() 
    { 
     return name; 
    } 
} 

मैं मूल रूप से ExchangeFileAttachment वर्ग के getName() विधि कॉल करना चाहते हैं; हालांकि, उपर्युक्त घोषणा गलत है। इसके साथ किसी भी मदद की सराहना की है। धन्यवाद

+1

क्या आपका इरादा 'बेसफाइलएटैचमेंट' पर पूरी तरह से नई 'GetName' विधि प्रदान करना है जो _hides_ 'BaseAttachment.GetName' है? यदि नहीं, तो पुनर्विक्रय छोड़ दें। –

+0

'एक्सचेंजफाइलएटैचमेंट' को 'अमूर्त' घोषित क्यों किया गया है? –

+2

"हालांकि, उपर्युक्त घोषणा गलत है" आपको वास्तव में अपने प्रश्नों में अधिक जानकारी प्रदान करनी चाहिए। क्या यह संकलित नहीं है? क्या यह आपकी इच्छा नहीं कर रहा है? यदि हां, तो त्रुटियां या अवांछित व्यवहार क्या हैं? – Servy

उत्तर

19

दो तात्कालिक समस्याओं मुझे लगता है कि अपने अंतिम ExchangeFileAttachment वर्ग abstract घोषित किया जाता है है, तो आप यह कभी नहीं का दृष्टांत कर सकेंगे। जब तक आपके पास विरासत का एक और स्तर न हो, आप हमें नहीं दिखा रहे हैं, इसे कॉल करना संभव नहीं होगा - इसका उपयोग करने का कोई तरीका नहीं है। दूसरी समस्या यह है कि BaseFileAttachment में ऐसी संपत्ति है जो GetName() को BaseAttachment में छिपा रही है। संरचना में आप हमें दिखा रहे हैं, यह अनावश्यक है और छोड़ा जा सकता है।

public abstract class BaseAttachment 
{ 
    public abstract string GetName(); 
} 

public abstract class BaseFileAttachment : BaseAttachment 
{ 
} 

public class ExchangeFileAttachment : BaseFileAttachment 
{ 
    string name; 
    public override string GetName() 
    { 
     return name; 
    } 
} 

मैं उद्धरण में सही पड़ सकते हैं क्योंकि इस यूज-केस अभी भी तो मैं आशा करती हूं कि आप अधिक जानकारी दे सकते हैं भावना का एक टन नहीं है, या इस: तो, 'ठीक किया' कोड अधिक की तरह लग रहे हैं आपके अंत में बहुत अधिक समझ में आता है।

+0

इस कोड उदाहरण ने मेरे उत्तर को एक पूरी तरह से अलग सवाल में मदद की! –

11

बस BaseFileAttachment से पुन: घोषणा निकालें:

public abstract class BaseFileAttachment : BaseAttachment 
{ 
} 

BaseFileAttachment पहले से ही BaseAttachment से सार GetName घोषणा इनहेरिट करती है। क्या तुम सच में BaseFileAttachment में फिर से उल्लेख करना चाहते हैं, override कीवर्ड का उपयोग करें:

public abstract class BaseFileAttachment : BaseAttachment 
{ 
    public override abstract string GetName(); // that's fine as well 
} 
+0

यह काम करता है! धन्यवाद – stoney78us

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