2008-10-24 9 views
7

मैं कक्षा एक है:व्युत्पन्न वर्ग पर जेनेरिक contraints

public class ClassA<T> 

कक्षा बी ए से निकला है:

public class ClassC : ClassB 
:

public class ClassB : ClassA<ClassB> 

कक्षा सी क्लास B से निकला

अब मैं बाधाओं

public static T Method<T>() where T : ClassA<T> 

ठीक साथ एक सामान्य विधि है, अब मैं कॉल करना चाहते हैं:

ClassC c = Method<ClassC>(); 

लेकिन मैं संकलन त्रुटि कह मिलती है: Type argument 'ClassC' does not inherit from or implement the constraint type 'ClassA<ClassC>.

फिर भी, कंपाइलर अनुमति देगा:

ClassB b = Method<ClassB>(); 

मेरे समझ है कि इस में विफल रहता है क्योंकि ClassC विरासत ClassA<ClassB>ClassA<ClassC>

के बजाय है मेरे असली सवाल है, यह एक वर्ग ClassB से पाने कि जेनेरिक विधि के साथ किसी तरह से इस्तेमाल किया जा सकता बनाने के लिए संभव है?

ऐसा लगता है कि जेनेरिकों का अधिक उपयोग किया जा रहा है और मैं सहमत हूं। मैं एक अलग परियोजना में सबसोनिक डेटा ऑब्जेक्ट्स से प्राप्त व्यावसायिक परत ऑब्जेक्ट्स बनाने की कोशिश कर रहा हूं।

नोट: मैंने < टी> अतिरिक्त रिक्त स्थान के साथ रखा है अन्यथा वे प्रश्न से अलग हो गए हैं।

public static T Method<T,U>() where T : ClassA<U> where U : T 

बिल्कुल कि मदद करता है:

उत्तर

5

ठीक है, आप के लिए विधि को बदल सकता है? यदि आप कोर्स नहीं बदल सकते हैं तो इसका अधिक उपयोग नहीं है ...

+0

हाँ, इससे समस्या हल हो जाती है। विधि वास्तव में है: डीबी.गेट < T > (स्ट्रिंग प्राथमिक कॉलमवैल्यू) टी डेटाबेस से डेटा ऑब्जेक्ट वापस करने के लिए उपयोग किया जाता है। ऐसा लगता है कि यह अधिक जटिल हो रहा है कि इसे होना जरूरी है ... मुझे वापस कदम उठाने और वास्तुकला के बारे में पुनर्विचार करने की आवश्यकता है। – ptutt

2

नहीं। आपको इस विधि को बदलना या लपेटना होगा।

यहां कारण है।

ClassC ClassB जो ClassA (ClassB) से विरासत

ClassC ClassA (ClassC) से विरासत नहीं है से विरासत

ClassB का कोई बच्चा, ClassA (बच्चे वर्ग) से प्राप्त कर लेंगे, क्योंकि वे बजाय से विरासत कक्षा बी और कक्षा बी कक्षा (बाल वर्ग) से प्राप्त नहीं है।

Generic types are invariant

1

ज्यादातर मामलों में यह एक आधार गैर सामान्य सार वर्ग होने से इस परिदृश्य को हल करने के लिए संभव है:

public abstract class BasicClassA 
{ 
} 

public class ClassA<T> : BasicClassA 
{ 
} 

public class ClassB : ClassA<ClassB> 
{ 
} 

public class ClassC : ClassB 
{ 
} 

public static T Method<T>() where T : BasicClassA 
{ 
    return null; 
} 

आपका लाभ हालांकि, भिन्न हो सकते हैं।

+0

इस मामले में यह सुझाव परिदृश्य को हल नहीं करता है क्योंकि क्लास पर "विधि" विधियों को कॉल किया जाता है जो कि वापसी प्रकार टी। हालांकि सुझाव के लिए धन्यवाद। – ptutt