2011-07-01 11 views
7

सी ++ टेम्पलेट्स के साथ लाभों में से एक यह है कि आप (निहित) को एक निश्चित प्रकार के हस्ताक्षर की आवश्यकता हो सकती है (उदाहरण के लिए टाइप टी में फ़ंक्शन x होना आवश्यक है जो कोई पैरामीटर नहीं लेता है और एक int देता है)। क्या सी # जेनेरिक कुछ समान समर्थन करते हैं?क्या सी # जेनेरिक समर्थन प्रकार हस्ताक्षर बाधाओं का समर्थन करता है?

मुझे बेस क्लास या इंटरफ़ेस के आधार पर बाधाओं से अवगत है, लेकिन यह वह नहीं है जिसे मैं ढूंढ रहा हूं।

(के रूप में एक सी ++ प्रोग्रामर सीखने सी # मैं गलत है कि यह एक सुविधा है जो आपको सी # में नहीं देखना चाहेंगे हो सकता है। इस पर किसी भी टिप्पणी के रूप में अच्छी तरह से appriciated जाएगा ...)

+4

लेकिन इंटरफ़ेस बाधाएं कुछ टी हस्ताक्षर करने के लिए पहले से ही एक विधि एक्स() को कुछ हस्ताक्षर से मेल करने के लिए एक बहुत अच्छा तरीका है, क्या आपको नहीं लगता? –

उत्तर

6

आपके द्वारा पहले से देखी गई बाधाओं को छोड़कर कुछ भी नहीं (जो उचित है, उचित परिस्थितियों को कवर करता है)। कुछ सामान्य कामकाज से जुड़े हैं:

  • dynamic, 4.0 मैनुअल बतख टाइपिंग में
  • या तो प्रतिबिंब या आईएल पीढ़ी आदि इनमें से

कोई भी उपयोग कर रहा है स्थिर प्रकार की जाँच आदि, हालांकि।

+0

गतिशील शायद मुझे सबसे नज़दीक मिल सकता है। असल में, मैं अक्सर "गतिशील संकलन समय भाषा" के रूप में सी ++ टेम्पलेट्स के बारे में सोचता हूं (जो शायद एक ऐसा वाक्यांश है जो किसी को भी समझ में नहीं आता है :) –

+0

@ टोबियास मैं "स्थिर-चेक बतख- टाइप किया गया "; पी (' गतिशील 'रनटाइम के प्रभाव पड़ता है, लेकिन मुझे पता है कि आपका क्या मतलब है) –

+0

और अचानक यह सभी को समझ में आता है :) –

0

कमी के 5 प्रकार के होते हैं आप जेनिक्स पर डाल सकते हैं .Net:

  1. व्युत्पन्न बाधाएं एक प्रकार पैरामीटर की बढ़ती स्थिति बताती हैं।
  2. इंटरफेस बाधाएं अंतरफलक हैं जो टाइप पैरामीटर द्वारा कार्यान्वित की जाती हैं।
  3. मूल्य प्रकार की बाधाएं एक प्रकार के पैरामीटर को किसी मान प्रकार पर प्रतिबंधित करती हैं।
  4. संदर्भ प्रकार की बाधाएं संदर्भ प्रकार में एक प्रकार पैरामीटर प्रतिबंधित करती हैं।
  5. कन्स्ट्रक्टर बाधाएं निर्धारित करती हैं कि प्रकार पैरामीटर में डिफ़ॉल्ट या पैरामीटर रहित कन्स्ट्रक्टर है।

This पृष्ठ अधिक जानकारी दिखाता है।

+0

"मुझे बेस क्लास या इंटरफ़ेस के आधार पर बाधाओं से अवगत है, लेकिन यह वह नहीं है जिसे मैं ढूंढ रहा हूं।" –

4

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

चाहे आप की तलाश में हों या नहीं, इस तरह आप इसे पूरा करते हैं। :)

+1

यह अभी भी सभी विकल्पों को कवर नहीं करता है, हालांकि - पैरामीटर, ऑपरेटरों, स्थिर विधियों के साथ निर्माता , आदि ... –

+0

@Marc वैसे इस स्थिति में एक सही समाधान नहीं है - जैसा कि आपने अपने उत्तर में देखा था। ओपी को अपना काम पूरा करने के लिए थोड़ा मोड़ना होगा। और उसे आपके द्वारा उल्लिखित किसी भी चीज की आवश्यकता नहीं हो सकती है। वह चाहता है कि उसकी जेनेरिक क्लास "फ़ंक्शन एक्स" के अनुरूप हो, जो कोई पैरामीटर नहीं लेती है और एक इंट देता है " –

+0

@Marc, मैं सहमत हूं, और गैर-डिफ़ॉल्ट कन्स्ट्रक्टर पर बाधाओं का समर्थन करना अच्छा IMHO होगा। दूसरों, इतना ज्यादा नहीं, * विशेष रूप से * ऑपरेटरों :) –

1

नहीं। interface एस के लिए यह है। एक interface बनाएं जो उस अनुबंध को परिभाषित करता है जिसे आप प्रकार की बाधाओं में लागू करना चाहते हैं। फिर बाधाओं में निर्दिष्ट करें।

0

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

आप हस्ताक्षर द्वारा विधि की तलाश करके प्रतिबिंब के साथ व्यवहार की नकल करने का प्रयास कर सकते हैं, लेकिन यह एक रनटाइम बाधा है, और संकलन-समय की बाधा नहीं है।

0

नहीं, सी # में इस तरह की बाधा नहीं है।

आप जानते हैं, सामान्य कमी केवल एक आधार वर्ग या एक अंतरफलक, या कुछ अन्य बाधाओं (निर्माता बाधा new(), संदर्भ प्रकार बाधा class, मान प्रकार बाधा struct) की विरासत को लागू कर सकते हैं।

आप प्रतिनिधियों का उपयोग करके अपने वांछित व्यवहार को प्राप्त करने में सक्षम हो सकते हैं, और कई जेनेरिक प्रतिनिधि उपलब्ध हैं।
उदाहरण के लिए, Func<int> एक प्रतिनिधि है जो कोई पैरामीटर नहीं लेता है और int देता है। Func<string, DateTime, int> एक string और DateTime आदि लेता है और एक int देता है, ...

3

नहीं, यह संभव नहीं है। यह मुख्य रूप से सी ++ टेम्पलेट्स और सी # जेनेरिक के बीच अंतरों के कारण होता है:

जब आप सी ++ टेम्पलेट संकलित करते हैं, परिणामी कोड में vector<int> और vector<string> जैसे प्रकार होते हैं। इसका मतलब है कि कंपाइलर को सभी संभावित प्रकार पैरामीटर जानना है, लेकिन इसका मतलब यह भी है कि यह उन्हें शुद्धता के लिए जांच सकता है।

जब आप सी # जेनेरिक प्रकार संकलित करते हैं, तो आप वास्तव में केवल एक सामान्य प्रकार बना रहे हैं: List<T>। इस वजह से, सी # कंपाइलर को संकलन प्रकार पर सभी संभावित प्रकारों को नहीं जानना है, जिसका अर्थ है कि आप बाइनरी पुस्तकालयों में सामान्य प्रकार प्राप्त कर सकते हैं, जो सी ++ के साथ संभव नहीं है। लेकिन इसका मतलब यह भी है कि आप सभी प्रकार की जांच नहीं कर सकते हैं। ऐसा कुछ करने में सक्षम होने के लिए, बाधाएं हैं, लेकिन वे कई चीजें नहीं कर सकते हैं सी ++ की संकलन समय जांच कर सकते हैं, जैसे कुछ तरीकों की उपस्थिति की जांच करना (इंटरफ़ेस या कुछ बेस क्लास का उपयोग किए बिना) या उपयुक्त ऑपरेटरों की उपस्थिति।

सी # 4 में, आप कुछ हद तक dynamic का उपयोग कर टेम्पलेट्स के इस प्रकार के समान प्रभाव को प्राप्त कर सकते हैं, लेकिन यह करता कोई संकलन समय की जाँच, जिसका अर्थ है आप सुरक्षा खोना - यदि आप एक प्रकार नहीं है कि में डाल सकते हैं उचित सदस्य और आप तब तक नहीं पाएंगे जब तक कि आप रनटाइम पर कोड की उस पंक्ति तक नहीं पहुंच जाते।

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