मुझे बोल्ड शुरू करने दें: मैं इसे रखने की प्रेरणा पूरी तरह समझता हूं और कुछ लोगों की प्रेरणा को समझ नहीं सकता इसके खिलाफ बहस करने के लिए ...
आप क्या चाहते हैं nonvirtual ad hoc polymorphism।
- तदर्थ: कार्यान्वयन भिन्न हो सकते हैं
- nonvirtual: प्रदर्शन के कारणों के लिए; संकलन प्रेषण
शेष मेरी राय में चीनी है।
सी ++ में टेम्पलेट्स के माध्यम से पहले से ही पॉलीमोर्फिज्म है। हालांकि "अवधारणाएं" स्पष्ट करती हैं कि उपयोगकर्ता द्वारा परिभाषित इकाई किस प्रकार की विज्ञापन पॉलिमॉर्फिक कार्यक्षमता का उपयोग किया जाता है।
सी # बस इसे करने का कोई तरीका नहीं है। एक दृष्टिकोण जो गैर-वर्चुअल नहीं होगा: यदि फ्लोट जैसे प्रकार केवल "अनौपचारिक" या "IAddable" (...) जैसे कुछ लागू करेंगे, तो हम कम से कम एक सामान्य न्यूनतम, अधिकतम, lerp लिखने में सक्षम होंगे और उस क्लैंप, मैपेंज, बेजियर (...) के आधार पर। हालांकि यह तेज़ नहीं होगा। आप उसे नहीं चाहते हैं। यह शायद नहीं है कि ज्यादा एक ओवरहेड की बढ़ेगी बाद से नेट वैसे भी JIT संकलन करता भी List<MyClass>
(मूल्य और संदर्भ प्रकार के मतभेद के कारण) के लिए की तुलना में List<int>
के लिए अलग कोड उत्पन्न करता है: इस फिक्सिंग की
तरीके विज्ञापन पॉलीमोर्फिक भागों के लिए भी अलग कोड उत्पन्न करते हैं। सी # भाषा को इसे व्यक्त करने के लिए बस एक तरीका चाहिए। एक तरीका वह है जो आपने स्केच किया है।
एक और तरीका समारोह एक तदर्थ बहुरूपी फ़ंक्शन का उपयोग करने के लिए प्रकार की कमी को जोड़ने के लिए होगा:
U SuperSquare<T, U>(T a) applying{
nonvirtual operator (*) T (T, T)
nonvirtual Foo U (T)
}
{
return Foo(a * a);
}
बेशक आप अधिक से अधिक की कमी लग सकती है जब बार फू का उपयोग करता है को लागू करने की
। तो आप एक तंत्र को कई बाधाओं का नाम दे सकते हैं जो आप नियमित रूप से उपयोग करते हैं ... हालांकि यह फिर से चीनी है और इसे देखने का एक तरीका सिर्फ टाइपक्लास अवधारणा का उपयोग करना होगा ...
नाम देना कई बाधाओं एक प्रकार वर्ग को परिभाषित करने की तरह है, लेकिन मैं सिर्फ संक्षिप्त नाम तंत्र के कुछ प्रकार के रूप में यह को देखने के लिए चाहते हैं - समारोह प्रकार की कमी की एक मनमाना वसूली के लिए चीनी:
// adhoc is like an interface: it is about collecting signatures
// but it is not a type: it dissolves during compilation
adhoc AMyNeeds<T, U>
{
nonvirtual operator (*) T (T, T)
nonvirtual Foo U (T)
}
U SuperSquare<T, U>(T a) applying AMyNeeds<T, U>
{
return Foo(a * a);
}
कुछ जगह पर "मुख्य" सभी प्रकार के तर्क ज्ञात हैं और सबकुछ ठोस हो जाता है और इसे एक साथ संकलित किया जा सकता है।
क्या अभी भी गुम है क्या विभिन्न कार्यान्वयन बनाने की कमी है। ऊपरी उदाहरण में हम केवल पॉलिमॉर्फिक फ़ंक्शंस का उपयोग करते हैं और सभी को पता है ...
कार्यान्वयन उसके बाद फिर से विस्तार के तरीकों के रास्ते का अनुसरण कर सकते हैं - किसी भी बिंदु पर किसी भी वर्ग में कार्यक्षमता जोड़ने के करने की क्षमता में:
public static class SomeAdhocImplementations
{
public nonvirtual int Foo(float x)
{
return round(x);
}
}
मुख्य में आप अब लिख सकते हैं:
int a = SuperSquare(3.0f); // 3.0 * 3.0 = 9.0 rounded should return 9
कंपाइलर सभी "nonvirtual" विज्ञापन कार्यों की जांच करता है, एक अंतर्निहित फ्लोट (*) ऑपरेटर और int Foo (float)
दोनों पाता है और इसलिए उस रेखा को संकलित करने में सक्षम है।
विज्ञापन का पॉलीमोर्फिज्म निश्चित रूप से नीचे आता है कि आपको प्रत्येक संकलन समय प्रकार के लिए पुन: संकलित करना होगा ताकि सही कार्यान्वयन सम्मिलित हो जाएं। और शायद आईएल समर्थन नहीं करता है कि एक डीएल में डाल दिया जा रहा है। लेकिन हो सकता है कि वे वैसे भी इस पर काम करें ...
मुझे एक प्रकार के वर्ग के निर्माण की अनावश्यकता की कोई वास्तविक आवश्यकता नहीं है। यदि संकलन पर कुछ भी असफल हो जाता है तो हमें बाधाओं की त्रुटियां मिलती हैं या यदि उन्हें "adhoc" कोडक्लॉक के साथ एक साथ जोड़ दिया गया है तो त्रुटि संदेश और भी पठनीय हो सकता है।
MyColor a = SuperSquare(3.0f);
// error: There are no ad hoc implementations of AMyNeeds<float, MyColor>
// in particular there is no implementation for MyColor Foo(float)
लेकिन निश्चित रूप से एक प्रकार के वर्ग/"एडोक पॉलीमोर्फिज्म इंटरफ़ेस" का अस्थिरता भी सोचने योग्य है। त्रुटि संदेश तब बताएगा: "The AMyNeeds constraint of SuperSquare has not been matched. AMyNeeds is available as StandardNeeds : AMyNeeds<float, int> as defined in MyStandardLib
"। अन्य तरीकों के साथ एक वर्ग में कार्यान्वयन करना भी संभव होगा और समर्थित इंटरफेस की सूची में "adhoc इंटरफ़ेस" जोड़ें।
लेकिन विशेष भाषा डिज़ाइन से स्वतंत्र: मुझे उन्हें एक तरफ या दूसरे जोड़ने का नकारात्मक हिस्सा नहीं दिख रहा है। स्थाई रूप से टाइप की गई भाषाओं को हमेशा अभिव्यक्तिशील शक्ति की सीमा को धक्का देना होगा, क्योंकि वे बहुत कम अनुमति देकर शुरू होते हैं, जो अभिव्यक्तिशील शक्ति का एक छोटा सेट होता है, एक सामान्य प्रोग्रामर संभव होने की उम्मीद करता ...
tldr : मैं तुम्हारे पक्ष में हूं। इस तरह की सामग्री मुख्यधारा में स्थाई रूप से टाइप की गई भाषाओं में बेकार है। हास्केल ने रास्ता दिखाया।
नेट एक प्रकार की कक्षा का समर्थन करता है: नया। मुझे लगता है कि वे लागू नहीं किए गए हैं क्योंकि कार्यान्वयन की लागत की तुलना में नेट क्या है 'अब के लिए पर्याप्त है'। –
मुझे नहीं लगता कि मैं उन चीजों को भ्रमित कर रहा हूं, मैं दोनों की तुलना कर रहा हूं और समझा रहा हूं कि सी ++ में, "अवधारणाओं" को स्पष्ट रूप से लागू करने के लिए अभी भी "अवधारणाओं" को स्पष्ट रूप से परिभाषित करने के लिए प्राथमिकता दी गई है, इस तथ्य के बावजूद कि प्रकार हैं (और होना चाहिए) स्पष्ट रूप से सी ++ में परिभाषित किया गया है। कम से कम, मैं कोशिश कर रहा हूं - मुझे लगता है कि मैं असफल हो सकता हूं ... –
@ स्टेव जेसॉप: मेरी टिप्पणी विशेष रूप से आपकी पोस्ट पर लागू नहीं होती है (यह वास्तव में एक बहुत ही उपयोगी उत्तर है) - मैं बस संभावना को रोकना चाहता था आम तौर पर सवाल गलतफहमी का। – Dario