2011-09-06 17 views
8

एक बेस क्लास है जिसमें सामान्य प्रकार की एक विधि है और मुझे यकीन है कि मेरे व्युत्पन्न में मैं एक स्ट्रिंग लौटा दूंगा। यह मेरा कोड है:टाइप पैरामीटर घोषणा एक पहचानकर्ता नहीं होना चाहिए

public abstract class Base 
    { 
     public virtual T GetSomething<T>() 
     { 
      return default(T); 
     } 
    } 

    public class Extended : Base 
    { 
     public override string GetSomething<string>() 
     { 
      return string.Empty; 

      //return base.GetSomething<T>(); 
     } 
    } 

लेकिन यह कोड संकलित नहीं करता है। क्या कोई गलती को देख सकता है? मुझे यकीन है कि मेरी विस्तारित कक्षा में मैं केवल स्ट्रिंग वापस करना चाहता हूं। मैं इसे कैसे हल करूं?

उत्तर

8

आप एक ठोस कार्यान्वयन के साथ एक सामान्य विधि को ओवरराइड नहीं कर सकते हैं; ऐसा नहीं है कि जेनेरिक कैसे काम करते हैं। उदाहरण के लिए Extended कक्षा GetSomething<int>() पर कॉल को संभालने में सक्षम होना चाहिए।

दूसरे शब्दों में, ओवरराइडिंग विधि के लिए हस्ताक्षर समान होना चाहिए जिस विधि को ओवरराइड किया जा रहा है। विधि के ठोस जेनेरिक कार्यान्वयन को निर्दिष्ट करके, आप इसके हस्ताक्षर को बदलते हैं।

इस दृष्टिकोण का उपयोग पर विचार करें:

public override T GetSomething<T>() 
{ 
    if (typeof(T) == typeof(string)) 
     return string.Empty; 

    return base.GetSomething<T>(); 
} 

ध्यान दें कि JIT सशर्त दूर का अनुकूलन करना चाहिए जब इस पद्धति का एक विशेष इन्स्टेन्शियशन संकलन। (यदि ऐसा नहीं होता है तो यह बहुत अच्छा नहीं है!)

(आपके ओवरराइड के लिए सिंटैक्स तकनीकी रूप से सही है, लेकिन अन्य कारणों से भी विफल रहता है। उदाहरण के लिए, आप कीवर्ड string कीवर्ड का उपयोग नहीं कर सकते जेनेरिक पैरामीटर नाम। और यदि आप कर सकते हैं, तो आपका कोड अभी भी जो भी आप चाहते हैं वह नहीं करेगा, और न ही यह संकलित होगा, क्योंकि संकलक सुपरटेप पर उस हस्ताक्षर के साथ कोई विधि नहीं ढूंढ पाएगा।)

+2

या आधार बदलें 'सार्वजनिक अमूर्त वर्ग बेस ' – Eranga

+0

शायद कक्षा विस्तार, और फिर विस्तारित: बेस '। यह निश्चित रूप से संभव है। यह तुरंत स्पष्ट नहीं है कि ओपी क्या पूरा करने की कोशिश कर रहा है, इसलिए मैंने उस दृष्टिकोण को चुना जिसकी कक्षा के डिजाइन में न्यूनतम परिवर्तन की आवश्यकता है। – cdhowie

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