C++ में इंटरफ़ेस: कैसे घोषित करें और अपना दिमाग न खोएं

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C++ में इंटरफ़ेस: उन लोगों के लिए गाइड जो गूगल करके थक गए हैं

\n\n

यदि आपने कभी Java या C# में लिखा है और फिर C++ पर आए हैं, तो आपने निश्चित रूप से सोचा होगा: "यहाँ interface कीवर्ड कहाँ है?". स्पॉइलर: यह मौजूद नहीं है। C++ में इंटरफ़ेस अलग तरीके से लागू किए जाते हैं — एब्सट्रैक्ट क्लासेस के माध्यम से। और यह कोई बग नहीं, बल्कि एक फीचर है जो अविश्वसनीय लचीलापन प्रदान करता है।

\n\n

Stack Overflow पर प्रश्न "How do you declare an interface in C++?" हजारों बार देखा जाता है। इसका मतलब है कि अनुभवी डेवलपर्स भी कभी-कभी भ्रमित हो जाते हैं। आज हम एक बार और हमेशा के लिए समझ लेंगे कि C++ में इंटरफ़ेस कैसे घोषित करें, ताकि आपका कोड साफ हो और कंपाइलर खुश रहे।

\n\n

C++ में इंटरफ़ेस क्या है? (स्पॉइलर: यह एक एब्सट्रैक्ट क्लास है)

\n\n

शास्त्रीय OOP में, इंटरफ़ेस एक अनुबंध है। इंटरफ़ेस को लागू करने वाला क्लास बाध्य है कि वह अपने सभी तरीकों का कार्यान्वयन प्रदान करे। C++ में यह भूमिका एब्सट्रैक्ट क्लास निभाता है — एक ऐसा क्लास जिसमें कम से कम एक प्योर वर्चुअल फंक्शन (pure virtual function) होता है।

\n\n

मुख्य नियम याद रखें:

\n
    \n
  • इंटरफ़ेस = एक क्लास जहाँ सभी तरीके प्योर वर्चुअल हों।
  • \n
  • एब्सट्रैक्ट क्लास = एक क्लास जहाँ कम से कम एक तरीका प्योर वर्चुअल हो (लेकिन इसमें कार्यान्वयन के साथ सामान्य तरीके भी हो सकते हैं)।
  • \n
\n\n

शुद्ध इंटरफ़ेस के लिए हम पहला विकल्प उपयोग करते हैं: कोई तर्क नहीं, केवल घोषणाएँ।

\n\n

शुद्ध इंटरफ़ेस कैसे घोषित करें: मूल सिंटैक्स

\n\n

यहाँ एक ज्यामितीय आकृति के लिए इंटरफ़ेस का न्यूनतम उदाहरण है:

\n\n
class IShape {\npublic:\n    virtual double area() const = 0;      // प्योर वर्चुअल फंक्शन\n    virtual double perimeter() const = 0; // एक और\n    virtual ~IShape() {}                  // वर्चुअल डिस्ट्रक्टर — अनिवार्य!\n};
\n\n

घोषणा के अंत में = 0 पर ध्यान दें। यह "प्योर वर्चुअल" का जादुई चिह्न है। ऐसे तरीके का बेस क्लास में कोई बॉडी (कार्यान्वयन) नहीं होता है।

\n\n

मुख्य बिंदु:

\n
    \n
  • प्रीफ़िक्स I क्लास के नाम में — इंटरफ़ेस के लिए एक अनकहा सम्मेलन (I = Interface)। इसका उपयोग नहीं कर सकते, लेकिन यह कोड पढ़ने को आसान बनाता है।
  • \n
  • वर्चुअल डिस्ट्रक्टर अनिवार्य है। यदि आप इंटरफ़ेस पॉइंटर के माध्यम से किसी ऑब्जेक्ट को हटाते हैं, तो वर्चुअल डिस्ट्रक्टर के बिना व्यवहार अपरिभाषित होगा (पढ़ें: प्रोग्राम क्रैश हो जाएगा)।
  • \n
  • सभी तरीके public हों — इंटरफ़ेस बाहर से कॉल करने योग्य होना चाहिए।
  • \n
\n\n

इंटरफ़ेस का कार्यान्वयन: शब्दों से काम तक

\n\n

अब हम एक ऐसा क्लास लिखेंगे जो हमारे इंटरफ़ेस IShape को लागू करता है। मान लीजिए यह एक वृत्त है:

\n\n
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\n

अब सबसे दिलचस्प बात — हम एक समान इंटरफ़ेस के माध्यम से विभिन्न आकृतियों के साथ काम कर सकते हैं:

\n\n
void 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 का संदर्भ लेता है। इससे कोई फर्क नहीं पड़ता कि कौन सा ऑब्जेक्ट पास किया गया — वृत्त, वर्ग या त्रिभुज। जब तक वे इंटरफ़ेस लागू करते हैं, सब कुछ काम करेगा। इसे ही पॉलीमॉर्फिज़्म कहते हैं।

ब्लॉग

पुस्तक अनुशंसाएँ