2009-07-24 15 views
21

मैं सोच रहा था कि क्या कई सामान्य बाधाओं को जोड़ना संभव है?सी # एकाधिक सामान्य बाधाएं

मैं एक जोड़ें विधि है कि एक वस्तु (या तो ईमेल, फ़ोन या एड्रेस) लेता है, इसलिए मैं कुछ ऐसा सोच रहा था:

public void Add<T>(T Obj) 
    where T : Address 
    where T : Email 
    where T : Phone 
{ 
    if (Obj is Address) 
     m_Address.Add(Obj as Address); 
    else if (Obj is Email) 
     m_Email.Add(Obj as Email); 
    else 
     m_Phone.Add(Obj as Phone); 
} 

लेकिन मैं मिलती रहती है:

"A constraint clause has already been specified for type parameter 'T'. All of the constraints for a type parameter must be specified in a single where clause."

उत्तर

25

आप ऐसा नहीं कर सकते क्यों न केवल तीन विधियां हैं और संकलक आपके लिए कड़ी मेहनत करते हैं?

public void Add(Address address) { m_Address.Add(address); } 
public void Add(Email email) { m_Email.Add(email); } 
public void Add(Phone phone) { m_Phone.Add(phone); } 
+1

तो, किसी भी अन्य सामान्य IEnumerable की तरह इस तरह के एक ** दृढ़ता से टाइप किया जेनेरिक संग्रह 'विषम types' की ** से अधिक की गणना करने के लिए? –

+0

@ अंगुमन आगरवाल - मुझे लगता है कि यह संग्रह पर 'ऐड' विधि नहीं है क्योंकि इससे बहुत अधिक अर्थ नहीं होगा। –

+1

मान लीजिए, अगर मेरे पास 'IWalk, IRun और IBothWalkRun' इंटरफ़ेस है। अब, मैं सभी प्रकारों में से एक दृढ़ता से टाइप किए गए विषम संग्रह को बनाना चाहता हूं और इस तरह से यह कहता हूं कि यह उन सभी को प्रिंट करता है जो IWalk, IRun और IBothWalkRun? क्या यह समझ में आता है? –

1

उस स्थिति में, मैं परेशान नहीं होगा, क्योंकि आप वैसे भी तुलना कर रहे हैं। इसका उपयोग करें:

public void Add(object Obj) 
{ 
    if (Obj is Address) 
     m_Address.Add(Obj as Address); 
    else if (Obj is Email) 
     m_Email.Add(Obj as Email); 
    else if (Obj is Phone) 
     m_Phone.Add(Obj as Phone); 
    else 
     return; 
} 

मुझे नहीं लगता कि एकाधिक खंड समर्थित हैं। आप भी अलग विधि अधिभार भी हो सकता है।

5

उन तीन प्रकारों के लिए इंटरफ़ेस या बेस क्लास बनाने के बारे में कैसे?

लेकिन आपके कोड को देखते हुए, ऐसा लगता है कि आप सामान्य रूप से पर्याप्त उपयोग नहीं कर रहे हैं। जेनेरिक का उपयोग करने का मुद्दा यह है कि आपको इसे किसी विशेष प्रकार में डालने की आवश्यकता नहीं है (इस मामले में, आप हैं)।

9

सीएलआर एकाधिक विरासत की अनुमति नहीं देता है, जो ठीक है जिसे आप व्यक्त करने की कोशिश कर रहे हैं। TAddress, Email एक ही समय में Phone होना चाहिए (मुझे लगता है कि वे वर्ग नाम हैं)। इस प्रकार असंभव है। घटना क्या है, इस पूरी विधि को कोई समझ नहीं आता है। आपको या तो सभी तीन वर्गों के लिए आधार इंटरफ़ेस पेश करना होगा या Add विधि के तीन ओवरलोड का उपयोग करना होगा।

+9

@ एंटन, मुझे लगता है कि ओपी या बाधाओं के बारे में पूछ रहा है (नहीं और)। –

2

आपको इस मामले में जेनेरिक से कोई वास्तविक लाभ नहीं मिलता है। मैं बस प्रत्येक पैरामीटर प्रकार के लिए अलग-अलग ऐड विधियों का निर्माण करूंगा।

-4

जहां टी: सी 1, सी 2, सी 3। कॉमा बाधाओं के लिए अलग हो गया। बेस क्लास या इंटरफेस का उपयोग करने का प्रयास करें।

+4

यह काम नहीं करता है, इसलिए शून्य 1 –

0

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

public void Foo<T>() where T : Bar, IBaz, new() 
{ 
    // Your code here 
} 
संबंधित मुद्दे