2009-07-08 27 views
9

मेरे पास एक कक्षा है जिसमें वर्तमान में कई विधियां हैं जो पूर्णांक पैरामीटर लेती हैं। ये पूर्णांक उन परिचालनों के लिए मानचित्र हैं जो एप्लिकेशन कर सकते हैं। मैं कक्षा को सामान्य बनाना चाहता हूं ताकि कक्षा के उपभोक्ता एक enum प्रकार प्रदान कर सकें जो उनके पास सभी परिचालनों के साथ है, तो विधियां उस enum प्रकार के पैरामीटर ले लेंगी। हालांकि, मैं चाहता हूं कि वे एक सामान्य प्रकार को निर्दिष्ट न करें, और वर्तमान में से वाक्यविन्यास में कोई बदलाव न होने पर इसे पूर्णांक में डिफ़ॉल्ट रूप से वापस कर दें। क्या यह संभव है?आप जेनेरिक के लिए डिफ़ॉल्ट प्रकार कैसे प्रदान करते हैं?

+0

@ Vilx- समाधान एक अच्छा दृष्टिकोण और बेहतर जवाब नहीं है:

class MyGenericClass<T> { } class MyGenericClass : MyGenericClass<int> { } 

इस तरह आप दोनों तरीकों से लिख सकता है? –

उत्तर

4

आप वर्ग की परिभाषा में यह नहीं कर सकते:

var foo = new MyGenericClass(); // defaults to integer... this doesn't work 
var bar = new MyGenericClass<MyEnum>(); // T is a MyEnum 

वास्तव में डिफ़ॉल्ट प्रकार से किया जा रहा int की implicitness मूल्य हैं, तो आप एक स्थिर कारखाने के साथ यह करना होगा विधि, हालांकि मुझे इसका मूल्य नहीं दिख रहा है।

public class MyGenericClass<T> 
{ 
    public static MyGenericClass<T> Create() 
    { 
     return new MyGenericClass<T>(); 
    } 
    public static MyGenericClass<int> CreateDefault() 
    { 
     return new MyGenericClass<int>(); 
    } 
} 

नीचे देखें कि आप वास्तव में उपर्युक्त से कैसे लाभ नहीं उठाते हैं।

var foo = MyGenericClass<MyEnum>.Create(); 
var bar1 = MyGenericClass.CreateDefault(); // doesn't work 
var bar2 = MyGenericClass<int>.CreateDefault(); // works, but what's the point 

आप लेने के लिए तो यह और भी आगे, आप एक स्थिर कारखाने वर्ग है कि इस का समाधान होगा बना सकते हैं चाहते हैं, लेकिन है कि एक और भी अधिक हास्यास्पद समाधान यदि आप कोई अन्य कारण एक डिफ़ॉल्ट प्रदान करने के लिए की तुलना में के लिए यह कर रहे हैं टाइप:

public static class MyGenericClassFactory 
{ 
    public static MyGenericClass<T> Create<T>() 
    { 
     return new MyGenericClass<T>(); 
    } 
    public static MyGenericClass<int> Create() 
    { 
     return new MyGenericClass<int>(); 
    } 
} 

var foo = MyGenericClassFactory.Create(); // now we have an int definition 
var bar = MyGenericClassFactory.Create<MyEnum>(); 
+0

हाँ, मैं उस जटिलता को पेश नहीं करना चाहता हूं। डिफ़ॉल्ट बेहद महत्वपूर्ण नहीं है, यह सिर्फ अच्छा होता। मैंने नहीं किया ' यह करने के किसी भी तरीके से नहीं जानता, लेकिन मैं सुनिश्चित करने के लिए पहले आप सभी लोगों के साथ जांचना चाहता था।जवाब के लिए धन्यवाद –

1

संकलक तरीकों समय के सबसे अधिक तर्क का प्रकार पारित कर के आधार पर प्रकार तर्क अनुमान लगा सकते हैं:

public void DoSomething<T>(T test) { 
} 

DoSomething(4);     // = DoSomething<int>(4); 
DoSomething(MyEnum.SomeValue); // = DoSomething<MyEnum>(MyEnum.SomeValue); 

वैसे साथ कहा जा सकता है, आप एक सामान्य विधि के गैर-जेनेरिक अधिभार भी प्राप्त कर सकते हैं।

+0

मैं कक्षा को "वैकल्पिक रूप से जेनेरिक" के प्रकार की तलाश में हूं। मुझे नहीं लगता कि यह संभव है इसलिए मुझे गैर-जेनेरिक ओवरलोड के साथ सामान्य तरीकों को बनाना होगा ... मैं इस "सुरक्षा कॉन्टेक्स्ट सेक = नई सुरक्षा कॉन्टेक्स्ट();" की तलाश में था। (जो इसे पैरामीटर के लिए पूर्णांक का उपयोग करके बनाएगा, और उसके बाद "सुरक्षा कॉन्टेक्स्ट sec = new SecurityContext ();" जो पैरामीटर –

2

अपना मूल संस्करण (गैर-जेनेरिक संस्करण) रखें और इसका एक सामान्य संस्करण बनाएं।

फिर अपने गैर-जेनेरिक संस्करण से जेनेरिक संस्करण को कॉल करें।

void Main() 
{ 
DoSomething(2); 
DoSomething(EnumValue); 

} 

public void DoSomething(int test) { 
DoSomething<int>(test); 
} 

// Define other methods and classes here 
public void DoSomething<T>(T test) { 
Console.WriteLine(test); 
} 
+0

पैरामीटर के लिए MyOperations का उपयोग करके इसे बनाएगा, सामान्य पैरामीटर प्रकार सभी विधियों के लिए समान होगा, इसलिए मैं इसे कक्षा के स्तर पर पसंद करूंगा। मुझे पता है कि मैं एक सामान्य संस्करण बना सकता हूं और उसके बाद int संस्करण के लिए इसका उत्तराधिकारी बना सकता हूं, लेकिन मैं बस इसे सभी में प्राप्त करने की उम्मीद कर रहा था ... लेकिन मुझे किसी भी तरह से पता नहीं था ऐसा करने के लिए। मुझे लगता है कि यह अपेक्षाकृत आसान नहीं है जैसा कि मैं उम्मीद कर रहा था। –

12

तो ... सरल विरासत का उपयोग क्यों नहीं करें? जैसा:

var X = new MyGenericClass<string>(); 
var Y = new MyGenericClass(); // Is now MyGenericClass<int> 
संबंधित मुद्दे

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