टेम्प्लेटेड प्रकारों को एक "अवधारणा" का पालन करना चाहिए (इनपुट Iterator, फॉरवर्ड Iterator, आदि ...) जहां अवधारणा का वास्तविक विवरण पूरी तरह से टेम्पलेट फ़ंक्शन / वर्ग के कार्यान्वयन द्वारा परिभाषित किया गया है, और प्रकार के वर्ग द्वारा नहीं टेम्पलेट के साथ उपयोग किया जाता है, जो OOP का कुछ विरोधी उपयोग है।
मुझे लगता है कि आप टेम्प्लेट द्वारा अवधारणाओं के उपयोग को गलत समझते हैं। फॉरवर्ड इटरेटर, उदाहरण के लिए, एक बहुत अच्छी तरह से परिभाषित अवधारणा है। उन भावों को खोजने के लिए जो एक वर्ग के लिए फॉरवर्ड इटरेटर के रूप में मान्य होने चाहिए, और कम्प्यूटेशनल जटिलता सहित उनके शब्दार्थ, आप मानक को देखते हैं या http://www.sgi.com/tech/stl/ForwardIterator.html पर (आपको यह सब देखने के लिए इनपुट, आउटपुट और ट्रिवियल इटरेटर के लिंक का पालन करना होगा)।
वह दस्तावेज़ एक पूरी तरह से अच्छा इंटरफ़ेस है, और "अवधारणा का वास्तविक विवरण" वहीं पर परिभाषित किया गया है। वे फॉरवर्ड Iterators के कार्यान्वयन द्वारा परिभाषित नहीं हैं, और न ही वे एल्गोरिदम द्वारा परिभाषित किए गए हैं जो फॉरवर्ड Iterators का उपयोग करते हैं।
एसटीएल और जावा के बीच इंटरफेस कैसे संभाला जाता है, इसके अंतर तीन गुना हैं:
1) एसटीएल ऑब्जेक्ट का उपयोग करके वैध अभिव्यक्तियों को परिभाषित करता है, जबकि जावा उन तरीकों को परिभाषित करता है जो ऑब्जेक्ट पर कॉल करने योग्य होना चाहिए। बेशक एक वैध अभिव्यक्ति एक विधि (सदस्य फ़ंक्शन) कॉल हो सकती है, लेकिन यह होना जरूरी नहीं है।
2) जावा इंटरफेस रनटाइम ऑब्जेक्ट हैं, जबकि एसटीएल अवधारणाएं आरटीटीआई के साथ भी रनटाइम पर दिखाई नहीं देती हैं।
3) यदि आप एसटीएल अवधारणा के लिए आवश्यक वैध भावों को वैध बनाने में विफल रहते हैं, तो जब आप टाइप के साथ कुछ टेम्पलेट को त्वरित करते हैं तो आपको अनिर्दिष्ट संकलन त्रुटि मिलती है। यदि आप एक जावा इंटरफेस की आवश्यक विधि को लागू करने में विफल रहते हैं, तो आपको ऐसा कहते हुए एक विशिष्ट संकलन त्रुटि मिलती है।
यह तीसरा भाग है यदि आप एक तरह का (संकलन-समय) "बतख टाइपिंग" पसंद करते हैं: इंटरफेस को अंतर्निहित किया जा सकता है। जावा में, इंटरफेस कुछ हद तक स्पष्ट हैं: एक वर्ग "Iterable है अगर और केवल अगर यह कहता है कि यह Iterable लागू करता है। कंपाइलर जांच कर सकता है कि उसके तरीकों के हस्ताक्षर सभी मौजूद हैं और सही हैं, लेकिन शब्दार्थ अभी भी निहित हैं (यानी वे या तो दस्तावेज हैं या नहीं, लेकिन केवल अधिक कोड (इकाई परीक्षण) आपको बता सकते हैं कि क्या कार्यान्वयन सही है)।
C ++ में, Python की तरह, शब्दार्थ और वाक्यविन्यास दोनों निहित हैं, हालांकि C ++ (और Python में यदि आपको मजबूत-टाइपिंग प्रीप्रोसेसर मिलता है) तो आपको कंपाइलर से कुछ मदद मिलती है। यदि किसी प्रोग्रामर को कार्यान्वयन वर्ग द्वारा इंटरफेस जैसे जावा की स्पष्ट घोषणा की आवश्यकता होती है, तो मानक दृष्टिकोण प्रकार के लक्षणों का उपयोग करना है (और कई विरासत इस क्रिया को रोक सकते हैं)। जावा के साथ तुलना में क्या कमी है, एक एकल टेम्पलेट है जिसे मैं अपने प्रकार के साथ त्वरित कर सकता हूं, और जो कि केवल और केवल तभी संकलित करेगा यदि सभी आवश्यक अभिव्यक्तियाँ मेरे प्रकार के लिए मान्य हैं। यह मुझे बताएगा कि क्या मैंने सभी आवश्यक बिट्स को लागू किया है, "इससे पहले कि मैं इसका उपयोग करूं"। यह एक सुविधा है, लेकिन यह OOP का मूल नहीं है (और यह अभी भी शब्दार्थ का परीक्षण नहीं करता है,
STL आपके स्वाद के लिए पर्याप्त रूप से OO हो सकता है या नहीं, लेकिन यह निश्चित रूप से इंटरफ़ेस को कार्यान्वयन से अलग करता है। यह इंटरफेस पर प्रतिबिंब करने के लिए जावा की क्षमता का अभाव है, और यह इंटरफ़ेस आवश्यकताओं के उल्लंघन को अलग तरीके से रिपोर्ट करता है।
आप फ़ंक्शन को बता सकते हैं ... अपनी परिभाषा को देखकर ही फॉरवर्ड इटरेटर की अपेक्षा करता है, जहाँ आपको कार्यान्वयन के लिए या दस्तावेज़ देखने की आवश्यकता होगी ...
व्यक्तिगत रूप से मुझे लगता है कि निहित प्रकार एक ताकत है, जब उचित रूप से उपयोग किया जाता है। एल्गोरिदम कहता है कि यह अपने टेम्पलेट मापदंडों के साथ क्या करता है, और कार्यान्वयनकर्ता यह सुनिश्चित करता है कि वे चीजें काम करती हैं: यह बिल्कुल सामान्य भाजक है जो "इंटरफेस" को करना चाहिए। इसके अलावा, STL के साथ, आप std::copyहेडर फ़ाइल में इसके आगे की घोषणा को खोजने के आधार पर , उपयोग करने की संभावना नहीं रखते हैं । प्रोग्रामर को काम करना चाहिए , जो फ़ंक्शन प्रलेखन पर आधारित है, न कि केवल फ़ंक्शन हस्ताक्षर पर। यह C ++, Python, या Java में सही है। किसी भी भाषा में टाइपिंग के साथ क्या हासिल किया जा सकता है, इस पर सीमाएं हैं, और कुछ ऐसा करने के लिए टाइपिंग का उपयोग करने की कोशिश नहीं करता (चेक शब्दार्थ) एक त्रुटि होगी।
उस ने कहा, एसटीएल एल्गोरिदम आमतौर पर अपने टेम्पलेट मापदंडों को एक तरह से नाम देते हैं जो यह स्पष्ट करता है कि अवधारणा की आवश्यकता क्या है। हालांकि यह दस्तावेज़ीकरण की पहली पंक्ति में उपयोगी अतिरिक्त जानकारी प्रदान करना है, न कि आगे की घोषणाओं को अधिक जानकारीपूर्ण बनाना। पैरामीटर के प्रकारों में एनकैप्सुलेट किए जा सकने के लिए आपको और भी बहुत सी चीजें हैं, इसलिए आपको डॉक्स पढ़ना होगा। (उदाहरण के लिए एल्गोरिदम में जो एक इनपुट रेंज और एक आउटपुट इटरेटर लेते हैं, संभावना है कि इनपुट रेंज के आकार के आधार पर आउटपुट की एक निश्चित संख्या के लिए आउटपुट इटिटर को पर्याप्त "स्पेस" की आवश्यकता होती है और हो सकता है कि उसमें वेल्यू बहुत ज्यादा हो। )
यहाँ स्पष्ट रूप से घोषित इंटरफेस पर Bjarne है: http://www.artima.com/cppsource/cpp0xP.html
जेनरिक में, एक तर्क एक इंटरफ़ेस से व्युत्पन्न वर्ग का होना चाहिए (जे ++ इंटरफ़ेस के समतुल्य सार वर्ग है) जेनेरिक की परिभाषा में निर्दिष्ट है। इसका मतलब है कि सभी सामान्य तर्क प्रकार एक पदानुक्रम में फिट होने चाहिए। यह डिजाइन पर अनावश्यक बाधाओं को लागू करता है, डेवलपर्स की ओर से अनुचित दूरदर्शिता की आवश्यकता होती है। उदाहरण के लिए, यदि आप एक जेनेरिक लिखते हैं और मैं एक वर्ग को परिभाषित करता हूं, तो लोग आपकी जेनेरिक के लिए एक तर्क के रूप में मेरी कक्षा का उपयोग नहीं कर सकते हैं जब तक कि मैं आपके द्वारा निर्दिष्ट इंटरफ़ेस के बारे में नहीं जानता था और मेरी कक्षा को इससे प्राप्त किया था। वह कठोर है।
इसके चारों ओर दूसरे तरीके से देखते हुए, बतख टाइपिंग के साथ आप एक इंटरफ़ेस लागू कर सकते हैं बिना यह जाने कि इंटरफ़ेस मौजूद है। या कोई व्यक्ति एक इंटरफ़ेस जानबूझकर ऐसा लिख सकता है कि आपकी कक्षा इसे लागू करती है, अपने डॉक्स से यह देखने के लिए परामर्श करें कि वे आपके लिए कुछ भी नहीं मांगते हैं। यह लचीला है।