2013-05-14 16 views
5

मैं कैसे एक सामान्य प्रकार है जो accepts only a type of Integer, Long and String.जेनेरिक वर्ग आदिम प्रकार और स्ट्रिंग

मैं जानता हूँ कि हम एक ही वर्ग के लिए या नीचे दिए गए कोड

public class MyGenericClass<T> where T:Integer{ } 

या के साथ एक अंतरफलक को लागू करने से एक प्रकार सीमित कर सकते हैं बना सकता हूँ स्वीकार करता है पूर्णांक, लंबे समय से नहीं बल्कि स्ट्रिंग को संभालने के लिए

public class MyGenericClass<T> where T:struct 

यह एक सामान्य जो पूर्णांक, लंबी और स्ट्रिंग का केवल एक प्रकार को स्वीकार करता संभव है?

+10

क्या आप निश्चित हैं कि जेनेरिक आप यहां क्या चाहते हैं? जेनेरिक आम तौर पर बोर्ड में इस्तेमाल होने के लिए नियोजित होते हैं। आप वास्तव में क्या हल करने की कोशिश कर रहे हैं? –

+2

@ म्यू-रस यह साक्षात्कारकर्ता द्वारा पूछा गया था। मैंने ज़रूरत से पूछा, उसने जवाब दिया कि 'आवश्यकता है' :( – Billa

+4

मेरा जवाब होगा "आप नहीं कर सकते हैं, और यदि आप इसे ठीक से सामान्य नहीं कर सकते हैं। इसके बजाय तीन अलग-अलग वर्ग लिखें।" –

उत्तर

10

आप संभावित वर्ग घोषणा में कमी नहीं सकता है, लेकिन एक स्थिर निर्माता में कुछ प्रकार-चेकिंग कार्य करें:

public class MyGenericClass<T> 
{ 
    static MyGenericClass() // called once for each type of T 
    { 
     if(typeof(T) != typeof(string) && 
      typeof(T) != typeof(int) && 
      typeof(T) != typeof(long)) 
      throw new Exception("Invalid Type Specified"); 
    } // eo ctor 
} // eo class MyGenericClass<T> 

संपादित करें:

मैथ्यू वाटसन जैसा कि ऊपर बताते हैं, असली जवाब "आप नहीं कर सकते और नहीं करना चाहिए"। अपने साक्षात्कारकर्ता का मानना ​​है कि कि गलत हो सकता है, तो शायद आप नहीं देखते वैसे भी काम करना चाहते हैं;)

+0

कूल। ऐसा लगता है महान :) – Billa

+0

क्या संकलन समय जांच करना संभव है? यह रनटाइम – Billa

+0

@ बिल्ला पर प्रतिबंधित है, नहीं, लेकिन आप संभावित मामलों को कम करने के लिए कुछ अतिरिक्त इंटरफेस जोड़ सकते हैं जैसे कि 'आईसीओम्पेर्बल, आईकोनर्टेबल' – Lucero

2

मेरा सुझाव है कि आप यह जान सकें कि मानों तो एक वस्तु में मान संग्रहीत स्वीकार्य हैं कंस्ट्रक्टर्स का उपयोग करें। निम्नलिखित की तरह:

class MyClass 
{ 
    Object value; 

    public MyClass(int value) 
    { 
     this.value = value; 
    } 

    public MyClass(long value) 
    { 
     this.value = value; 
    } 

    public MyClass(string value) 
    { 
     this.value = value; 
    } 

    public override string ToString() 
    { 
     return value.ToString(); 
    } 
} 
संबंधित मुद्दे