2010-06-29 10 views
6
List<T> Foo<T>(Ilist list) 
where T : ?? 

टी को कुछ कक्षाओं में से एक को लागू करने का कोई तरीका है?जहां टी: एकाधिक वर्ग

अंत में मैं टी पर एक स्विच ..

धन्यवाद करना चाहते हैं।

+0

उन 'कुछ संबंधित classes' हैं या वे एक आम आधार वर्ग या कि उन सभी को लागू इंटरफ़ेस साझा करते हैं? –

+3

बस जागरूक रहें कि आप कभी-कभी जेनरिक के साथ बहुत दूर जा सकते हैं। मैं हाल ही में कुछ काम कर रहा हूं और एक जटिल जेनेरिक संरचना थी जहां मेरे पास कक्षा था जहां पी , एस था। यह सब अच्छा और सामान्य था, लेकिन इंजीनियर बनने के बाद समाप्त हो गया और मैं इसे प्रभावी ढंग से उपयोग नहीं कर सका। इसके बजाय मुझे कोड 3 तरीकों को विभाजित करना था और विभिन्न वर्गों में समान कोड दोहराना स्वीकार करना था। – Ian

+9

यहां अंगूठे का एक त्वरित नियम है - यदि आप 'टी' पर 'स्विच' करने के बारे में सोचते हैं, या इसे 'if' के साथ भी जांचते हैं, तो आप जेनेरिक गलत कर रहे हैं। एक कदम वापस ले लो और कैसे आंकड़े। – Kobi

उत्तर

9

इस तरह से एक प्रकार की बाधा लागू करने से संकेत मिलता है कि वे कई वर्ग सामान्य कार्यक्षमता से संबंधित हैं।

आप एक आम इंटरफ़ेस को लागू करना चाहिए और फिर उस इंटरफ़ेस प्रकार प्रतिबंधित:

public interface IUseful 
{ 
    public void UsefulMethod(); 
} 

List<T> Foo<T>(IList list) where T : IUseful 
{ 
    // You now have access to all common functionality defined in IUseful 
} 

अतिरिक्त लाभ यह है कि अब आप अलग अलग व्यवहार को लागू करने के T पर स्विच करने के लिए नहीं है। आपके पास IUseful के बच्चे अपने स्वयं के व्यवहार लागू कर सकते हैं और फिर प्रत्येक को स्वयं कॉल कर सकते हैं।

+0

मैं कुछ इसी तरह की तलाश में हूं। मैं मानता हूं कि एक आम इंटरफेस सबसे अच्छा समाधान है। हालांकि वर्तमान में मैं दो पुस्तकालयों का उपयोग कर रहा हूं, और मैं सामान्य इंटरफ़ेस का उपयोग करने के लिए अपना कोड नहीं बदल सकता। तो इंटरफ़ेस के बिना ऐसा करने का कोई तरीका है? –

6

इस मामले में, टी एक सामान्य बेस क्लास या इंटरफ़ेस हो सकता है जिसे आप ऑब्जेक्ट शेयर सूचीबद्ध करते हैं। आपके पास List<IFoo> हो सकता है, और सूची में Foo, Bar, and Baz कक्षाएं हो सकती हैं यदि वे प्रत्येक IFoo इंटरफ़ेस को लागू करते हैं। विरासत का उपयोग करने से कम, आप वस्तुओं की एक सूची के साथ फंस जाएगा।

15

आप की आवश्यकता हो सकती है कि प्रत्येक वर्ग आप अपनी सूची में अनुमति देना चाहते हैं कुछ इंटरफेस ISomething लागू करता है और फिर एक List<ISomething> पैदा करते हैं।

अंत में मैं टी पर एक स्विच करना चाहते हैं ..

वस्तु यह बेहतर हो सकता है के प्रकार पर एक स्विच के बजाय

अपने इंटरफेस में एक विधि है और प्रत्येक के लिए अलग तरह से इसे लागू करने के कक्षा।

+0

+1। – Ian

+0

+1 यही वह पोस्ट था जो मैं पोस्ट करने आया था। –

1

जहाँ तक मुझे पता है, यह संभव नहीं है। मैं एक सामान्य बेस क्लास या इंटरफ़ेस से कक्षाओं के अपने सीमित सेट को प्राप्त करने की अनुशंसा करता हूं।

2

आप क्या चाहते हैं? कोलन के बाद, आप उन प्रकारों की गणना कर सकते हैं जिन पर आप T को बाध्य करते हैं।

कई कक्षाओं के लिए, शायद एक सामान्य इंटरफेस को कार्यान्वित करना और अपनी बाधा को स्थापित करना यह चाल हो सकता है।

अधिक जानकारी के लिए इस लिंक पर नज़र डालें: Constraints on Type Parameters (C# Programming Guide)

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