एक इंटरफ़ेस उस वर्ग के किसी विशेष कार्यान्वयन के लिए प्रतिबद्ध किए बिना C++ वर्ग के व्यवहार या क्षमताओं का वर्णन करता है।
सी ++ इंटरफेस को अमूर्त वर्गों का उपयोग करके कार्यान्वित किया जाता है और इन अमूर्त वर्गों को डेटा एब्स्ट्रैक्शन के साथ भ्रमित नहीं किया जाना चाहिए जो कि कार्यान्वयन विवरण को संबंधित डेटा से अलग रखने की अवधारणा है।
एक वर्ग अपने कार्यों में से कम से कम एक शुद्ध आभासी फ़ंक्शन के रूप में घोषित करके अमूर्त बना दिया जाता है। एक शुद्ध वर्चुअल फ़ंक्शन को इसकी घोषणा में "=0" रखकर निर्दिष्ट किया जाता है -
class Box { public: // pure virtual function virtual double getVolume() = 0; private: double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box };
एक सार वर्ग . का उद्देश्य (अक्सर एबीसी के रूप में संदर्भित) एक उपयुक्त आधार वर्ग प्रदान करना है जिससे अन्य वर्ग इनहेरिट कर सकते हैं। अमूर्त वर्गों का उपयोग वस्तुओं को तत्काल करने और केवल एक इंटरफ़ेस के रूप में सेवा करने के लिए नहीं किया जा सकता है। अमूर्त वर्ग के किसी ऑब्जेक्ट को इंस्टेंट करने का प्रयास करने से संकलन त्रुटि होती है।
इस प्रकार, यदि एबीसी के उपवर्ग को तत्काल करने की आवश्यकता है, तो उसे प्रत्येक आभासी कार्यों को लागू करना होगा, जिसका अर्थ है कि यह एबीसी द्वारा घोषित इंटरफ़ेस का समर्थन करता है। किसी व्युत्पन्न वर्ग में शुद्ध वर्चुअल फ़ंक्शन को ओवरराइड करने में विफलता, फिर उस वर्ग की वस्तुओं को तत्काल करने का प्रयास करना, एक संकलन त्रुटि है।
जिन वर्गों का उपयोग वस्तुओं को त्वरित करने के लिए किया जा सकता है, उन्हें ठोस वर्ग . कहा जाता है ।
निम्नलिखित उदाहरण पर विचार करें जहां पेरेंट क्लास getArea() नामक फ़ंक्शन को लागू करने के लिए बेस क्लास को एक इंटरफ़ेस प्रदान करता है। -
उदाहरण कोड
#include <iostream> using namespace std; class Shape { // Base class public: // pure virtual function providing interface framework. virtual int getArea() = 0; void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; class Rectangle: public Shape { // Derived classes public: int getArea() { return (width * height); } }; class Triangle: public Shape { public: int getArea() { return (width * height)/2; } }; int main(void) { Rectangle Rect; Triangle Tri; Rect.setWidth(5); Rect.setHeight(7); // Print the area of the object. cout << "Total Rectangle area: " << Rect.getArea() << endl; Tri.setWidth(5); Tri.setHeight(7); // Print the area of the object. cout << "Total Triangle area: " << Tri.getArea() << endl; return 0; }
आउटपुट
Total Rectangle area: 35 Total Triangle area: 17
आप देख सकते हैं कि कैसे एक अमूर्त वर्ग ने getArea() के संदर्भ में एक इंटरफ़ेस को परिभाषित किया और दो अन्य वर्गों ने एक ही फ़ंक्शन को लागू किया लेकिन आकार के लिए विशिष्ट क्षेत्र की गणना करने के लिए एक अलग एल्गोरिथ्म के साथ।
डिजाइन रणनीति
एक वस्तु-उन्मुख प्रणाली सभी बाहरी अनुप्रयोगों के लिए उपयुक्त एक सामान्य और मानकीकृत इंटरफ़ेस प्रदान करने के लिए एक सार आधार वर्ग का उपयोग कर सकती है। फिर, उस अमूर्त आधार वर्ग से विरासत के माध्यम से, व्युत्पन्न वर्ग बनते हैं जो समान रूप से संचालित होते हैं।
बाहरी अनुप्रयोगों द्वारा प्रदान की जाने वाली क्षमताएं (यानी, सार्वजनिक कार्य) अमूर्त आधार वर्ग में शुद्ध आभासी कार्यों के रूप में प्रदान की जाती हैं। इन शुद्ध आभासी कार्यों का कार्यान्वयन व्युत्पन्न वर्गों में प्रदान किया जाता है जो विशिष्ट प्रकार के अनुप्रयोग के अनुरूप होते हैं।
यह आर्किटेक्चर सिस्टम के परिभाषित होने के बाद भी नए एप्लिकेशन को सिस्टम में आसानी से जोड़ने की अनुमति देता है।