जेनेरिक बेस क्लास से इनहेरिट, एक बाधा लागू करें, और C # में एक इंटरफ़ेस लागू करें


117

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

यह वही है जो मेरे पास है:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... }

पहली बात यह है कि यह ध्यान में आया:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... }

लेकिन यह गलत है क्योंकि इससे टी 2 को आईबीआर और आईफू दोनों को लागू करने की जरूरत है, आईवीयू को लागू करने के लिए डेरिवफू को नहीं।

मैंने थोड़ा गोग्लिंग, कॉलन, अर्धविराम आदि का उपयोग करने की कोशिश की है, लेकिन मैं छोटा हो गया हूं। मुझे यकीन है कि इसका जवाब सर पर बिलकुल आसान है।


मैं @ आदम के उत्तर को समझ नहीं सका जब मैंने एक बार देखा लेकिन 2 मिनट के बाद मुझे मिल सकता है कि यह क्या है, उत्तर के लिए धन्यवाद। व्युत्पन्न वर्ग में एक से अधिक कार्यान्वयन हो सकते हैं यह बात है। वैसे भी मैं दूसरों के लिए इसकी धारणा दिखाना चाहता हूं। "क्लास डेरिवेडक्लास <टाइप>: पेरेंटक्लास जहां टाइप: आईटाइप"। अंतिम कार्यान्वित वर्ग और जहां खंड के बीच कुछ भी नहीं होना चाहिए।
नर्सिज़िन

जवाबों:


173

जेनेरिक बाधाओं को परिभाषित करने से पहले आप अपनी कक्षा के संपूर्ण हस्ताक्षर शामिल करते हैं।

class DerivedFoo<T1, T2> : ParentFoo<T1, T2>, IFoo where T2 : IBar
{
    ...
}

5
दूसरों के लिए, मैंने इसे आंतरिक रूप दिया है, एक वर्ग को केवल एक ही खंड मिलता है, और यह किसी भी और सभी सामान्य प्रकार की बाधाओं के लिए अंत में जाता है।
एंडी वी

@Visser यह कई के लिए अनुमति दी है, जहां खंड, वर्ग टेस्ट <T1, T2> जहां टी 1: Interface1 जहां टी 2: Interface2
bwing

@ वीसर हाँ, जो बोइंग ने कहा, यह भी कि प्रत्येक जहाँ खंड में कई बाधाएँ हो सकती हैं ... इसलिए मूल पोस्ट से वाक्य रचना सही है, इसका मतलब सिर्फ कुछ अलग है जो ऑप चाहता था। where T2 : IBar, IFoo इसका मतलब है कि T2लागू करने के बजाय दोनों इंटरफेस को DerivedFoo<T1,T2> लागू करना हैIFoo
v01pe

18

मेरी सिफारिश: जब आपके पास C # भाषा के सिंटैक्स के बारे में एक प्रश्न है, तो विनिर्देश पढ़ें; इसलिए हम इसे प्रकाशित करते हैं। आप सेक्शन 10.1 पढ़ना चाहेंगे।

आपके विशिष्ट प्रश्न का उत्तर देने के लिए, कक्षा घोषणा में चीजों का क्रम है:

  • विशेषताएँ, वर्ग कोष्ठक में
  • संशोधक ("सार्वजनिक", "स्थिर", और इसी तरह)
  • "आंशिक"
  • "कक्षा"
  • वर्ग का नाम
  • कोण कोष्ठक के अंदर प्रकार पैरामीटर घोषणाओं की अल्पविराम से अलग सूची
  • एक बृहदान्त्र ने आधार प्रकारों की एक अल्पविराम से पृथक सूची का पालन किया (आधार वर्ग और कार्यान्वित इंटरफेस, आधार वर्ग पहले जाना चाहिए अगर वहाँ एक है)
  • प्रकार पैरामीटर की कमी
  • वर्ग का शरीर, ब्रेसिज़ से घिरा हुआ
  • एक अर्धविराम

"वर्ग", नाम और निकाय को छोड़कर उस सूची में सब कुछ वैकल्पिक है, लेकिन ऐसा प्रतीत होने पर सब कुछ उसी क्रम में दिखाई देना चाहिए।


95
एरिक, जबकि मैं आपको एक पेशेवर के रूप में बहुत सम्मान करता हूं और आपकी प्रतिक्रिया की सराहना करता हूं, मैं मदद नहीं कर सकता लेकिन एक अपघर्षक जवाब के रूप में जो आता है उससे निराश हो सकता हूं। आप एक प्रोग्रामिंग क्यू एंड ए साइट पर एक सवाल पूछने के लिए चुनने के लिए मेरी आलोचना कर रहे हैं, जिसे डाउनलोड करने और डाउनलोड करने के लिए एक अत्यधिक तकनीकी 503 पेज वर्ड दस्तावेज़ के माध्यम से MSDN में एक लिंक को दफन कर दिया। यह बहुत कठिन है। यह मेरे समय का सबसे कुशल उपयोग था और इसमें अतिरिक्त लाभ है कि यह बाद में किसी और की मदद कर सकता है। इच्छुक लोगों के लिए सी # लैंग स्पैशन
Dan Rigby

17
कोई आलोचना का उद्देश्य नहीं था। शुद्ध-पाठ संप्रेषण में एक व्यापक पूर्वाग्रह है जो तथ्यों के सरल बयानों को ध्वनिहीन और अपघर्षक बनाता है; जब मैं सहायक तथ्यों की सूची के साथ प्रस्तुत किया जाता हूं, तो मैं पढ़ने की कोशिश करता हूं और सलाह देता हूं कि आप भी ऐसा ही करें। मैं अपनी सिफारिश से खड़ा हूं; यदि आपके पास सिंटैक्स के बारे में प्रश्न हैं, तो कल्पना उन्हें निश्चित रूप से उत्तर देती है और विशिष्ट सिंटैक्स की परिभाषाओं को खोजने के लिए सामग्री की एक सहायक तालिका के साथ शुरू होती है।
एरिक लिपर्ट

3
Dan, C # कल्पना को खोजना उतना ही सरल है जितना कि Google में 'C # Spec' दर्ज करना और 'I am lucky' बटन को हिट करना। और यदि आप एक पेशेवर सी # डेवलपर हैं, तो आपको अपनी मशीन में पीडीएफ प्रारूप में पहले से ही सी # युक्ति होना चाहिए। इसके अलावा, मेरा मतलब आपकी आलोचना करना भी नहीं है। मुझे पहले कल्पना पढ़ने की आदत नहीं थी लेकिन मैंने इसे जॉन, एरिक और पावेल के लिए पढ़ना शुरू कर दिया है जो हमेशा किसी भी प्रश्न के लिए सी # कल्पना को उद्धृत करते हैं। मैंने पाया कि सी # कल्पना, भले ही इसे कई बार पढ़ना कठिन हो, भाषा के बारे में जानने का एक शानदार तरीका है।
समाधानयोगी

@ एरिक लिपर्ट: काफी साफ। आपके जवाब के लिए धन्यवाद। रचनात्मक सुझाव के रूप में, यदि Microsoft एक अलग डाउनलोड के रूप में मौजूद है, तो Microsoft सीधे MSDN में विनिर्देश की सामग्री को एकीकृत करेगा, यह मददगार होगा। Visual Studio .Net MSDN संस्करण में विनिर्देशन का एक एकीकृत संस्करण है, लेकिन बाद के संस्करण नहीं। मैंने एंडर्स हेजलबर्ग की किताब खरीदने के लिए सोचा है, लेकिन .net 4.0 के साथ कोने के आसपास मैं अभी तक अनिच्छुक हूं। amazon.com/C-Programming-Language-3rd/dp/0321562992 धन्यवाद।
दान रिग्बी

2
सी ++ के लिए आवश्यक है कि अर्धविराम में एक वर्ग घोषणा समाप्त हो। कई सी # डेवलपर्स एक सी ++ पृष्ठभूमि से आते हैं; कभी-कभी उनकी उंगलियां अर्धविराम लगा देती हैं, जिसमें उनका दिमाग शामिल नहीं होता है। :-) C # में कई प्रकार के निर्माण हैं जो एक वैकल्पिक अर्ध लेते हैं जहाँ C ++ को एक की आवश्यकता होती है। यह बहुत ही सूक्ष्म सुविधा है। मुझे लगता है कि यह आपको एक प्रकार की घोषणा को समाप्त करने की अनुमति देता है जब आप एक प्रकार का शरीर घोषणा कह सकते हैं।
एरिक लिपर्ट


2
public class KeyAndValue<T>
{
    public string Key { get; set; }
    public virtual T Value { get; set; }
}

public class KeyAndValue : KeyAndValue<string>
{
    public override string Value { get; set; }
}

यह मौजूदा उत्तरों का विस्तार है। stringयदि आप एक प्रकार की आपूर्ति नहीं करते हैं तो यह चूक करता है। मैंने एक इंटरफ़ेस लागू नहीं किया, लेकिन इसके लिए सामान्य से अलग कुछ भी नहीं चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.