C++ में इंटरफ़ेस: उन लोगों के लिए गाइड जो गूगल करके थक गए हैं
\n\nयदि आपने कभी Java या C# में लिखा है और फिर C++ पर आए हैं, तो आपने निश्चित रूप से सोचा होगा: "यहाँ interface कीवर्ड कहाँ है?". स्पॉइलर: यह मौजूद नहीं है। C++ में इंटरफ़ेस अलग तरीके से लागू किए जाते हैं — एब्सट्रैक्ट क्लासेस के माध्यम से। और यह कोई बग नहीं, बल्कि एक फीचर है जो अविश्वसनीय लचीलापन प्रदान करता है।
\n\nStack Overflow पर प्रश्न "How do you declare an interface in C++?" हजारों बार देखा जाता है। इसका मतलब है कि अनुभवी डेवलपर्स भी कभी-कभी भ्रमित हो जाते हैं। आज हम एक बार और हमेशा के लिए समझ लेंगे कि C++ में इंटरफ़ेस कैसे घोषित करें, ताकि आपका कोड साफ हो और कंपाइलर खुश रहे।
\n\nC++ में इंटरफ़ेस क्या है? (स्पॉइलर: यह एक एब्सट्रैक्ट क्लास है)
\n\nशास्त्रीय OOP में, इंटरफ़ेस एक अनुबंध है। इंटरफ़ेस को लागू करने वाला क्लास बाध्य है कि वह अपने सभी तरीकों का कार्यान्वयन प्रदान करे। C++ में यह भूमिका एब्सट्रैक्ट क्लास निभाता है — एक ऐसा क्लास जिसमें कम से कम एक प्योर वर्चुअल फंक्शन (pure virtual function) होता है।
\n\nमुख्य नियम याद रखें:
\n- \n
- इंटरफ़ेस = एक क्लास जहाँ सभी तरीके प्योर वर्चुअल हों। \n
- एब्सट्रैक्ट क्लास = एक क्लास जहाँ कम से कम एक तरीका प्योर वर्चुअल हो (लेकिन इसमें कार्यान्वयन के साथ सामान्य तरीके भी हो सकते हैं)। \n
शुद्ध इंटरफ़ेस के लिए हम पहला विकल्प उपयोग करते हैं: कोई तर्क नहीं, केवल घोषणाएँ।
\n\nशुद्ध इंटरफ़ेस कैसे घोषित करें: मूल सिंटैक्स
\n\nयहाँ एक ज्यामितीय आकृति के लिए इंटरफ़ेस का न्यूनतम उदाहरण है:
\n\nclass IShape {\npublic:\n virtual double area() const = 0; // प्योर वर्चुअल फंक्शन\n virtual double perimeter() const = 0; // एक और\n virtual ~IShape() {} // वर्चुअल डिस्ट्रक्टर — अनिवार्य!\n};\n\nघोषणा के अंत में = 0 पर ध्यान दें। यह "प्योर वर्चुअल" का जादुई चिह्न है। ऐसे तरीके का बेस क्लास में कोई बॉडी (कार्यान्वयन) नहीं होता है।
मुख्य बिंदु:
\n- \n
- प्रीफ़िक्स I क्लास के नाम में — इंटरफ़ेस के लिए एक अनकहा सम्मेलन (I = Interface)। इसका उपयोग नहीं कर सकते, लेकिन यह कोड पढ़ने को आसान बनाता है। \n
- वर्चुअल डिस्ट्रक्टर अनिवार्य है। यदि आप इंटरफ़ेस पॉइंटर के माध्यम से किसी ऑब्जेक्ट को हटाते हैं, तो वर्चुअल डिस्ट्रक्टर के बिना व्यवहार अपरिभाषित होगा (पढ़ें: प्रोग्राम क्रैश हो जाएगा)। \n
- सभी तरीके public हों — इंटरफ़ेस बाहर से कॉल करने योग्य होना चाहिए। \n
इंटरफ़ेस का कार्यान्वयन: शब्दों से काम तक
\n\nअब हम एक ऐसा क्लास लिखेंगे जो हमारे इंटरफ़ेस IShape को लागू करता है। मान लीजिए यह एक वृत्त है:
class Circle : public IShape {\nprivate:\n double radius;\npublic:\n explicit Circle(double r) : radius(r) {}\n\n double area() const override {\n return 3.14159 * radius * radius;\n }\n\n double perimeter() const override {\n return 2 * 3.14159 * radius;\n }\n};\n\nकीवर्ड override (C++11 और नया) अनिवार्य नहीं है, लेकिन अत्यधिक वांछनीय है। यह कंपाइलर को जाँचने के लिए मजबूर करता है कि आप वास्तव में बेस क्लास से वर्चुअल तरीके को ओवरराइड कर रहे हैं। नाम में टाइपो? कंपाइलर कहेगा: "त्रुटि! इंटरफ़ेस में ऐसा कोई तरीका नहीं है"।
पॉलीमॉर्फिज़्म क्रियान्वित
\n\nअब सबसे दिलचस्प बात — हम एक समान इंटरफ़ेस के माध्यम से विभिन्न आकृतियों के साथ काम कर सकते हैं:
\n\nvoid printShapeInfo(const IShape& shape) {\n std::cout << "Area: " << shape.area() << "\\n";\n std::cout << "Perimeter: " << shape.perimeter() << "\\n";\n}\n\nint main() {\n Circle c(5.0);\n printShapeInfo(c); // काम करता है!\n return 0;\n}\n\nफंक्शन printShapeInfo IShape का संदर्भ लेता है। इससे कोई फर्क नहीं पड़ता कि कौन सा ऑब्जेक्ट पास किया गया — वृत्त, वर्ग या त्रिभुज। जब तक वे इंटरफ़ेस लागू करते हैं, सब कुछ काम करेगा। इसे ही पॉलीमॉर्फिज़्म कहते हैं।