2011-04-05 11 views
14

के साथ जेनेरिक मुझे दो सामान्य आधार वर्ग हैं। दूसरी जेनेरिक कक्षा में प्रथम श्रेणी के अपने पैरामीटर पर बाधा है।जेनेरिक पैरामीटर्स और सार कक्षा

abstract class FirstClass<T> {...} 

abstract class SecondClass<U> where U : FirstClass {...} 

यह काम नहीं करता है, क्योंकि फर्स्ट क्लास परिभाषित नहीं किया गया है। तो मुझे यह करने की ज़रूरत है।

abstract class FirstClass<T> {...} 

abstract class SecondClass<U, T> where U : FirstClass<T> {...} 

जो काम करता है। हालांकि, यह इन अमूर्त वर्गों को बदसूरत बना देता है।

class SomeClass {...} 

class MyFirstClass : FirstClass<SomeClass> {...} 

class MySecondClass : SecondClass<MyFirstClass, SomeClass> {...} 

यह मेरे लिए अनावश्यक लगता है क्योंकि मैं कुछ क्लास को दो बार निर्दिष्ट कर रहा हूं। क्या इस तरह से इसे घोषित करने का कोई तरीका है कि फर्स्ट क्लास से टी स्वचालित रूप से यू को द्वितीय क्लास के लिए है। मुझे ऐसा दिखने के लिए वास्तव में क्या पसंद आएगा।

class SomeClass {...} 

class MyFirstClass : FirstClass<SomeClass> {...} 

class MySecondClass : SecondClass<MyFirstClass> {...} 

जबकि मुझे संदेह है कि यह सटीक परिदृश्य संभव है, क्या कोई क्लीनर है जो मैं करने की कोशिश कर रहा हूं?

संपादित

कई लोगों ने एक IFirstClass इंटरफेस बनाने का सुझाव दिया है। लेकिन मेरी परिभाषाएं इसके करीब हैं।

class FirstClass<T> 
{ 
    public T MyObj { get; set; } 
} 

class SecondClass<U, T> where U : FirstClass<T> 
{ 
    U MyFirstClass { get; set; } 
} 

एक इंटरफ़ेस के साथ मैं SecondClass से MyFirstClass.MyObj तक नहीं पहुंच सकता। जबकि मैं IFirstClass पर object T MyObj { get; set; } बना सकता हूं, फिर इसे छिपाने के लिए new का उपयोग करें, अगर मैं ऐसा करता हूं तो चांदी की रोशनी बाध्यकारी में फिट हो जाती है।

+0

जबकि मैं इस सवाल में चांदी की रोशनी का उल्लेख नहीं करता हूं, यह एक चांदी की रोशनी परियोजना है। मुझे यकीन नहीं है कि यह समाधान को सीमित करेगा या नहीं। – cadrell0

+0

यदि आपने डब्ल्यूसीएफ आरआईए सेवाओं के अपने पीओसीओ कक्षाओं के रूप में टाइपऑफ मार्शल करने की कोशिश की है, तो जेनरिक्स को डब्ल्यूसीएफ या डब्ल्यूसीएफ आरआईए सेवाओं (कुछ प्रमुख कामकाज के बिना) के रूप में उजागर नहीं किया जा सकता है। –

+0

क्या आप फर्स्ट क्लास के बारे में किसी भी प्रकार की विशिष्ट जानकारी का उपयोग कर रहे हैं? यदि नहीं, तो इन उदाहरणों में मुझे क्या करना है, पहले क्लास कुछ IGenericFirstClass इंटरफ़ेस से मेल खाता है और फिर IGenericFirstClass के रूप में बाधा निर्दिष्ट करें। यह यू निर्भरता प्रकार को छुपाता है। –

उत्तर

4

यदि आप वास्तव में जेनेरिक प्रकार तर्कों का उपयोग FirstClass (जैसे, आपके संपादन से, ऐसा लगता है जैसे आप हैं), तो नहीं, जो आप खोज रहे हैं दुर्भाग्यवश संभव नहीं है। संकलक संबंधित तर्कों और जो नहीं हैं, के बीच अंतर नहीं करता है।

+1

मैंने यही सोचा, लेकिन अगर हमारे पास आशा नहीं है तो हमारे पास क्या होगा? – cadrell0

+0

@ cadrell0: careers.stackoverflow.com;) गंभीरता से, हालांकि, इन उत्तरों में से किसी एक को स्वीकार करना न भूलें। ये आपके बहुत ही विकल्प हैं। –

10

मेरे अनुभव में जेनेरिक कक्षाओं में गैर-सामान्य इंटरफ़ेस बनाना सबसे आसान है। यह समस्या को हल करता है जब आपको जेनेरिक प्रकार को जानने के बिना बेस क्लास में डालने की आवश्यकता होती है।

interface IFirstClass {...} 

abstract class FirstClass<T> : IFirstClass {...} 

abstract class SecondClass<T> where T : IFirstClass {...} 
+0

कृपया मेरे संपादन देखें। मैंने एक ऐसे मुद्दे में भाग नहीं लिया है जहां मुझे बेस क्लास में डालना होगा। – cadrell0

2

फर्स्ट क्लास उपकरण का एक इंटरफ़ेस बनाएं। फिर आप इंटरफेस में सेकेंड क्लास को बाधित कर सकते हैं।

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