टेम्प्लेट जेनेरिक प्रोग्रामिंग की नींव हैं, जिसमें कोड को इस तरह से लिखना शामिल है जो किसी विशेष प्रकार से स्वतंत्र हो।
एक सामान्य वर्ग या फ़ंक्शन बनाने के लिए एक टेम्पलेट एक ब्लूप्रिंट या सूत्र है। पुस्तकालय कंटेनर जैसे इटरेटर और एल्गोरिदम सामान्य प्रोग्रामिंग के उदाहरण हैं और टेम्पलेट अवधारणा का उपयोग करके विकसित किए गए हैं।
प्रत्येक कंटेनर की एक ही परिभाषा होती है, जैसे कि वेक्टर, लेकिन हम कई अलग-अलग प्रकार के वैक्टर को परिभाषित कर सकते हैं, उदाहरण के लिए, वेक्टर
उदाहरण कोड
#include <iostream> #include <string> using namespace std; template <typename T> inline T const& Max (T const& a, T const& b) { return a < b ? b:a; } int main () { int i = 39; int j = 20; cout << "Max(i, j): " << Max(i, j) << endl; double f1 = 13.5; double f2 = 20.7; cout << "Max(f1, f2): " << Max(f1, f2) << endl; string s1 = "Hello"; string s2 = "World"; cout << "Max(s1, s2): " << Max(s1, s2) << endl; return 0; }
आउटपुट
Max(i, j): 39 Max(f1, f2): 20.7 Max(s1, s2): World
दूसरी ओर, जावा जेनरिक के रूप में।
Java Generic Methods और Generic Classes प्रोग्रामर को एक ही मेथड डिक्लेरेशन के साथ, संबंधित मेथड्स का एक सेट, या सिंगल क्लास डिक्लेरेशन के साथ, संबंधित प्रकारों का एक सेट, क्रमशः निर्दिष्ट करने में सक्षम बनाती हैं।
जेनरिक कंपाइल-टाइम प्रकार की सुरक्षा भी प्रदान करता है जो प्रोग्रामर्स को कंपाइल समय पर अमान्य प्रकारों को पकड़ने की अनुमति देता है।
जावा जेनेरिक अवधारणा का उपयोग करते हुए, हम वस्तुओं की एक सरणी को छाँटने के लिए एक सामान्य विधि लिख सकते हैं, फिर सरणी तत्वों को क्रमबद्ध करने के लिए पूर्णांक सरणियों, डबल सरणियों, स्ट्रिंग सरणियों आदि के साथ सामान्य विधि को लागू कर सकते हैं।
सामान्य तरीके
आप एक एकल सामान्य विधि घोषणा लिख सकते हैं जिसे विभिन्न प्रकार के तर्कों के साथ बुलाया जा सकता है। जेनेरिक विधि को दिए गए तर्कों के प्रकारों के आधार पर, कंपाइलर प्रत्येक विधि कॉल को उचित रूप से संभालता है। जेनेरिक विधियों को परिभाषित करने के नियम निम्नलिखित हैं -
-
सभी सामान्य विधि घोषणाओं में कोण कोष्ठक (<और>) द्वारा सीमांकित एक प्रकार पैरामीटर अनुभाग होता है जो विधि के वापसी प्रकार (
अगले उदाहरण में) से पहले होता है। -
प्रत्येक प्रकार के पैरामीटर अनुभाग में अल्पविराम द्वारा अलग किए गए एक या अधिक प्रकार के पैरामीटर होते हैं। एक प्रकार पैरामीटर, जिसे एक प्रकार चर के रूप में भी जाना जाता है, एक पहचानकर्ता है जो एक सामान्य प्रकार का नाम निर्दिष्ट करता है।
-
प्रकार पैरामीटर का उपयोग रिटर्न प्रकार घोषित करने के लिए किया जा सकता है और जेनेरिक विधि को दिए गए तर्कों के प्रकारों के लिए प्लेसहोल्डर के रूप में कार्य किया जा सकता है, जिन्हें वास्तविक प्रकार के तर्क के रूप में जाना जाता है।
-
एक सामान्य विधि का शरीर किसी अन्य विधि की तरह घोषित किया जाता है। ध्यान दें कि टाइप पैरामीटर केवल संदर्भ प्रकारों का प्रतिनिधित्व कर सकते हैं, न कि आदिम प्रकार (जैसे int, double और char)।
उदाहरण कोड
public class GenericMethodTest { // generic method printArray public static < E > void printArray( E[] inputArray ) { // Display array elements for(E element : inputArray) { System.out.printf("%s ", element); } System.out.println(); } public static void main(String args[]) { // Create arrays of Integer, Double and Character Integer[] intArray = { 1, 2, 3, 4, 5 }; Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 }; Character[] charArray = { 'H', 'E', 'L', 'L', 'O' }; System.out.println("Array integerArray contains:"); printArray(intArray); // pass an Integer array System.out.println("\nArray doubleArray contains:"); printArray(doubleArray); // pass a Double array System.out.println("\nArray characterArray contains:"); printArray(charArray); // pass a Character array } }
आउटपुट
Array integerArray contains: 1 2 3 4 5 Array doubleArray contains: 1.1 2.2 3.3 4.4 Array characterArray contains: H E L L O
आइए अब हम टेम्प्लेट और जेनरिक के बीच के अंतरों को देखें। अंतर नीचे की तरह हैं -
-
यह टाइप-इरेज़र का उपयोग करता है; यह संकलन समय में सख्त प्रकार की जांच सुनिश्चित करता है। जावा में जेनरिक संकलन समय सुरक्षा प्रदान करता है और टाइपकास्टिंग की आवश्यकता को समाप्त करता है। यह सीधे जावा कंपाइलर फ्रंट एंड में मौजूद होता है ताकि यह सुनिश्चित किया जा सके कि इस प्रकार का इरेज़र किया गया है।
-
C++ में, यदि टेम्प्लेट का उपयोग किया जाता है, तो कंपाइलर दिए गए प्रकार के साथ जेनेरिक पैरामीटर को बदलने के बाद फिर से टेम्प्लेट कोड उत्सर्जित करता है।
-
जावा में भले ही हमें डेटाटाइप निर्दिष्ट करना पड़े, जिसके भीतर फ़ंक्शन किसी ऑब्जेक्ट का उपयोग करके कॉल करता है, हमें आवश्यक करने के लिए रैपर क्लासेस के बजाय वास्तविक डेटाटाइप के साथ इसे C++ के समान टाइपकास्ट करने की आवश्यकता नहीं है।
-
जावा जेनरिक इनिशियलाइज़ेशन समय में टाइप चेकिंग का उपयोग करता है, और गैर-जेनेरिक कोड के समकक्ष बाइट-कोड जेनरेट करता है C++ में "लेटरर्न टाइपिंग" और टेम्प्लेट मेटा-प्रोग्रामिंग है, और प्रत्येक इंस्टेंटेशन के लिए नई क्लास जेनरेट करता है।