मेरे पास एक कक्षा है जिसमें वर्तमान में कई विधियां हैं जो पूर्णांक पैरामीटर लेती हैं। ये पूर्णांक उन परिचालनों के लिए मानचित्र हैं जो एप्लिकेशन कर सकते हैं। मैं कक्षा को सामान्य बनाना चाहता हूं ताकि कक्षा के उपभोक्ता एक enum प्रकार प्रदान कर सकें जो उनके पास सभी परिचालनों के साथ है, तो विधियां उस enum प्रकार के पैरामीटर ले लेंगी। हालांकि, मैं चाहता हूं कि वे एक सामान्य प्रकार को निर्दिष्ट न करें, और वर्तमान में से वाक्यविन्यास में कोई बदलाव न होने पर इसे पूर्णांक में डिफ़ॉल्ट रूप से वापस कर दें। क्या यह संभव है?आप जेनेरिक के लिए डिफ़ॉल्ट प्रकार कैसे प्रदान करते हैं?
उत्तर
आप वर्ग की परिभाषा में यह नहीं कर सकते:
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>();
हाँ, मैं उस जटिलता को पेश नहीं करना चाहता हूं। डिफ़ॉल्ट बेहद महत्वपूर्ण नहीं है, यह सिर्फ अच्छा होता। मैंने नहीं किया ' यह करने के किसी भी तरीके से नहीं जानता, लेकिन मैं सुनिश्चित करने के लिए पहले आप सभी लोगों के साथ जांचना चाहता था।जवाब के लिए धन्यवाद –
संकलक तरीकों समय के सबसे अधिक तर्क का प्रकार पारित कर के आधार पर प्रकार तर्क अनुमान लगा सकते हैं:
public void DoSomething<T>(T test) {
}
DoSomething(4); // = DoSomething<int>(4);
DoSomething(MyEnum.SomeValue); // = DoSomething<MyEnum>(MyEnum.SomeValue);
वैसे साथ कहा जा सकता है, आप एक सामान्य विधि के गैर-जेनेरिक अधिभार भी प्राप्त कर सकते हैं।
मैं कक्षा को "वैकल्पिक रूप से जेनेरिक" के प्रकार की तलाश में हूं। मुझे नहीं लगता कि यह संभव है इसलिए मुझे गैर-जेनेरिक ओवरलोड के साथ सामान्य तरीकों को बनाना होगा ... मैं इस "सुरक्षा कॉन्टेक्स्ट सेक = नई सुरक्षा कॉन्टेक्स्ट();" की तलाश में था। (जो इसे पैरामीटर के लिए पूर्णांक का उपयोग करके बनाएगा, और उसके बाद "सुरक्षा कॉन्टेक्स्ट
अपना मूल संस्करण (गैर-जेनेरिक संस्करण) रखें और इसका एक सामान्य संस्करण बनाएं।
फिर अपने गैर-जेनेरिक संस्करण से जेनेरिक संस्करण को कॉल करें।
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);
}
पैरामीटर के लिए MyOperations का उपयोग करके इसे बनाएगा, सामान्य पैरामीटर प्रकार सभी विधियों के लिए समान होगा, इसलिए मैं इसे कक्षा के स्तर पर पसंद करूंगा। मुझे पता है कि मैं एक सामान्य संस्करण बना सकता हूं और उसके बाद int संस्करण के लिए इसका उत्तराधिकारी बना सकता हूं, लेकिन मैं बस इसे सभी में प्राप्त करने की उम्मीद कर रहा था ... लेकिन मुझे किसी भी तरह से पता नहीं था ऐसा करने के लिए। मुझे लगता है कि यह अपेक्षाकृत आसान नहीं है जैसा कि मैं उम्मीद कर रहा था। –
तो ... सरल विरासत का उपयोग क्यों नहीं करें? जैसा:
var X = new MyGenericClass<string>();
var Y = new MyGenericClass(); // Is now MyGenericClass<int>
- 1. जेनेरिक प्रकार के लिए डिफ़ॉल्ट?
- 2. आप पैकेज कोड द्वारा प्रदान किए गए हास्केल प्रकार वर्ग उदाहरणों को कैसे ओवरराइड करते हैं?
- 3. रूबी में आप बूलियन डिफ़ॉल्ट मान कैसे सेट करते हैं?
- 4. सी # और वीबी जेनेरिक क्यों हैं? वे क्या लाभ प्रदान करते हैं? जेनेरिक्स, FTW
- 5. कोर प्लॉट चार्ट के अक्ष के लिए आप लेबल कैसे प्रदान करते हैं?
- 6. आप प्रतिनिधि पैरामीटर के लिए एक्सएमएल टिप्पणियां/दस्तावेज़ीकरण कैसे प्रदान करते हैं?
- 7. आप आईफोन सिम्युलेटर में डिफ़ॉल्ट डिवाइस कैसे सेट करते हैं?
- 8. आप जेनेरिक इंटरफेस पंजीकृत करने के लिए कैसल विंडसर - फ्लुएंट इंटरफेस का उपयोग कैसे करते हैं?
- 9. आप WTForms SelectField के लिए डिफ़ॉल्ट मान कैसे सेट करते हैं?
- 10. डिफ़ॉल्ट प्रकार के उदाहरण एक दूसरे को संदर्भित करते हैं
- 11. आप UICollectionView एनिमेशन के लिए अवधि कैसे सेट करते हैं?
- 12. जावा: आप एक सामान्य प्रकार में निर्दिष्ट जेनेरिक प्रकार के समान होने के लिए कक्षा प्रकार पैरामीटर को कैसे लागू करते हैं?
- 13. क्या आप ToList() करते हैं?
- 14. आप पाइथन में फ़ाइल प्रकार को कैसे उपclass करते हैं?
- 15. जेनेरिक प्रकार
- 16. अनजान जेनेरिक प्रकार
- 17. आप टोमकैट के डिफ़ॉल्ट फेविकॉन को कैसे हटाते हैं?
- 18. कस्टम सिम्फनी फॉर्म फ़ील्ड प्रकार में खाली_वैल्यू विकल्प के लिए आप डिफ़ॉल्ट कैसे हैं?
- 19. आप प्रोटोटाइप कैसे करते हैं?
- 20. जेनेरिक प्रकार
- 21. क्या जेनेरिक पायथन पुस्तकालय हैं जो डीजेगो संकेतों की तरह 'संकेत' (घटना) क्षमता प्रदान करते हैं?
- 22. जेनेरिक प्रकार
- 23. आप Django ForeignKey फ़ील्ड के लिए डिफ़ॉल्ट कैसे निर्दिष्ट करते हैं?
- 24. सशर्त संकलन करने के लिए आप प्रकार के लक्षणों का उपयोग कैसे करते हैं?
- 25. आप कैसे प्रतिक्रिया करते हैं?
- 26. जेनेरिक प्रकार
- 27. जटिल निर्माण प्रक्रिया के लिए आप क्या उपयोग करते हैं?
- 28. जेनेरिक प्रकार
- 29. आप define_method के लिए तर्क कैसे पास करते हैं?
- 30. आप खाली इनपुट फ़ील्ड के लिए कैसे परीक्षण करते हैं?
@ Vilx- समाधान एक अच्छा दृष्टिकोण और बेहतर जवाब नहीं है:
इस तरह आप दोनों तरीकों से लिख सकता है? –