2012-08-05 13 views
5

कृपया मेरी कक्षा संरचना देखें। मुझे लगता है कि यह संभव है कि मैं विरासत के साथ और अधिक मज़ा लेना चाहूंगा।सी # - उन्नत विरासत

पहले एक आधार अमूर्त वर्ग है:

public abstract class PolicyDetailed<T> : PolicyDetailed where T : DataContainer 
{ 
    internal new abstract T GetActiveAsset(); 
} 

अन्त में एक विशेष नीति वर्ग है:

public abstract class PolicyDetailed 
{ 
    internal abstract DataContainer GetActiveAsset(); 
} 

अगला एक और अमूर्त वर्ग है, जो सामान्य है। AccidentContainer DataContainer से विरासत:

'PolicyAccident' does not implement inherited abstract member 'PolicyDetailed.GetActiveAsset()' 

मुझे यकीन है कि क्या संशोधक मैं यहाँ का उपयोग करना चाहिए यह काम करने के लिए प्राप्त करने के लिए नहीं कर रहा हूँ:

public class PolicyAccident : PolicyDetailed<AccidentContainer> 
{ 
    internal override AccidentContainer GetActiveAsset() 
    { 
     return null; 
    } 
} 

संकलन के दौरान मैं निम्नलिखित त्रुटि मिलती है। हो सकता है कि मुझे यह भी लिखना चाहिए कि मैं क्या हासिल करना चाहता हूं: मेरे पास विभिन्न प्रकार की पॉलिसी ऑब्जेक्ट्स का संग्रह है (उदा। पॉलिसीएसीडेंट, पॉलिसी ट्रेवल इत्यादि) जो पॉलिसी से प्राप्त होते हैं, विभिन्न प्रकार के डेटाकंटनर (दुर्घटनाकंटर, ट्रैवलकंटनर इत्यादि) के साथ सूचीबद्ध। मैं उनमें से प्रत्येक पर "GetActiveAsset" विधि को उनके विशिष्ट प्रकार को जानने और नीति के माध्यम से संदर्भित करने के लिए कॉल करना चाहता हूं। साथ ही मैं प्रत्येक वर्ग को अपने विशिष्ट डेटाकॉन्टेनर सबक्लास को वापस करना चाहता हूं। क्या यह संभव है?

+0

क्या यह स्पष्ट करना आपके लिए महत्वपूर्ण है कि विशिष्ट कंटेनर प्रकार उनके विशिष्ट नीति प्रकार लौटाते हैं? आप कहते हैं कि आप लौटाई गई वस्तुओं को नीति के रूप में संदर्भित करना चाहते हैं, और इस तरह आप वैसे भी विशिष्ट जानकारी खो देते हैं! (याद रखें कि AccidentContainer _IS_ डेटाकंटनर, और एक दुर्घटनाकंटर इस प्रकार किसी भी हस्ताक्षर को बदले बिना वापसी प्रकार डेटाकॉन्टेनर के साथ एक विधि से वापस किया जा सकता है) – olagjo

+0

मुझे कोड के अन्य हिस्सों में इसकी आवश्यकता है, जहां मैं विशिष्ट प्रकार की नीति का संदर्भ देता हूं और इसका उपयोग करता हूं विशिष्ट कंटेनर। मैं दो विधियों का उपयोग करने पर विचार कर सकता हूं - कोई डेटाकंटनर ऑब्जेक्ट वापस करेगा, दूसरा एक निर्दिष्ट कंटेनर वापस कर सकता है (लेकिन यह बेकार लगता है :() – Rummy

उत्तर

6

समस्या यह है कि आप उसी वर्ग में गैर-जेनेरिक विधि को ओवरराइड नहीं कर सकते हैं क्योंकि आप एक ही हस्ताक्षर के साथ कोई अन्य विधि घोषित करते हैं।

  • अब तक का सबसे सरल दो तरीकों अलग-अलग नाम दे रहा है:

    कुछ ही विकल्प हैं। तो फिर तुम PolicyDetailed<T> जो सिर्फ नए सार विधि के प्रतिनिधियों में एक कार्यान्वयन दे सकते हैं:

    public abstract class PolicyDetailed 
    { 
        internal abstract DataContainer GetActiveAsset(); 
    } 
    
    public abstract class PolicyDetailed<T> : PolicyDetailed where T : DataContainer 
    { 
        internal abstract T GetActiveAssetGeneric(); 
    
        internal override DataContainer GetActiveAsset() 
        { 
         return GetActiveAssetGeneric(); 
        } 
    } 
    
    public class PolicyAccident : PolicyDetailed<AccidentContainer> 
    { 
        internal override AccidentContainer GetActiveAssetGeneric() 
        { 
         return null; 
        }  
    } 
    
  • आप विरासत का एक अन्य स्तर पर दे सकते हैं, उद्देश्यों को पूरा करने के लिए एक नई विधि नाम सिर्फ शुरू। यह सुंदर बदसूरत है:

    public class DataContainer {} 
    public class AccidentContainer : DataContainer{} 
    
    public abstract class PolicyDetailed 
    { 
        internal abstract DataContainer GetActiveAsset(); 
    } 
    
    // This only exists to satisfy the base class abstract member, 
    // but at the same time allowing PolicyDetailed<T> to introduce 
    // a new member with the same name. 
    public abstract class PolicyDetailedBridge<T> : PolicyDetailed 
        where T : DataContainer 
    { 
        protected abstract T GetActiveAssetGeneric(); 
    
        internal override DataContainer GetActiveAsset() 
        { 
         return GetActiveAssetGeneric(); 
        } 
    } 
    
    public abstract class PolicyDetailed<T> : PolicyDetailedBridge<T> 
        where T : DataContainer 
    { 
        protected sealed override T GetActiveAssetGeneric() 
        { 
         // Call the *new* abstract method. Eek! 
         return GetActiveAsset(); 
        } 
    
        internal abstract new T GetActiveAsset(); 
    } 
    
    public class PolicyAccident : PolicyDetailed<AccidentContainer> 
    { 
        internal override AccidentContainer GetActiveAsset() 
        { 
         return null; 
        }    
    } 
    
  • आप के बजाय गैर सामान्य PolicyDetailed वर्ग एक अंतरफलक कर सकता है, और एक नया सार प्रणाली की घोषणा करने के लिए और अभी भी इंटरफ़ेस को लागू स्पष्ट इंटरफेस कार्यान्वयन का उपयोग करें।

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