একটি ইন্টারফেস একটি C++ ক্লাসের আচরণ বা ক্ষমতা বর্ণনা করে সেই ক্লাসের কোনো নির্দিষ্ট বাস্তবায়নে প্রতিশ্রুতি ছাড়াই।
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 };
একটি বিমূর্ত শ্রেণির উদ্দেশ্য (প্রায়শই একটি ABC হিসাবে উল্লেখ করা হয়) হল একটি উপযুক্ত বেস ক্লাস প্রদান করা যা থেকে অন্যান্য শ্রেণীগুলি উত্তরাধিকারী হতে পারে। বিমূর্ত ক্লাস অবজেক্ট ইনস্ট্যান্টিয়েট করতে এবং শুধুমাত্র একটি ইন্টারফেস হিসাবে পরিবেশন করতে ব্যবহার করা যাবে না। একটি বিমূর্ত শ্রেণীর একটি বস্তুকে ইনস্ট্যান্ট করার চেষ্টা করা একটি সংকলন ত্রুটি সৃষ্টি করে৷
এইভাবে, যদি একটি ABC-এর একটি সাবক্লাসকে ইনস্ট্যান্টিয়েট করার প্রয়োজন হয়, তাহলে একে প্রতিটি ভার্চুয়াল ফাংশন বাস্তবায়ন করতে হবে, যার অর্থ হল এটি ABC দ্বারা ঘোষিত ইন্টারফেসকে সমর্থন করে। একটি প্রাপ্ত ক্লাসে একটি বিশুদ্ধ ভার্চুয়াল ফাংশনকে ওভাররাইড করতে ব্যর্থতা, তারপর সেই শ্রেণীর বস্তুগুলিকে তাৎক্ষণিক করার চেষ্টা করা একটি সংকলন ত্রুটি৷
যে শ্রেণীগুলি বস্তুগুলিকে তাত্ক্ষণিক করতে ব্যবহার করা যেতে পারে তাকে কংক্রিট ক্লাস বলা হয় .
নিম্নলিখিত উদাহরণটি বিবেচনা করুন যেখানে অভিভাবক শ্রেণী 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() এর পরিপ্রেক্ষিতে একটি ইন্টারফেসকে সংজ্ঞায়িত করেছে এবং অন্যান্য দুটি শ্রেণী একই ফাংশন প্রয়োগ করেছে কিন্তু আকৃতির নির্দিষ্ট এলাকা গণনা করার জন্য একটি ভিন্ন অ্যালগরিদম দিয়ে।
ডিজাইন কৌশল
একটি অবজেক্ট-ওরিয়েন্টেড সিস্টেম সমস্ত বাহ্যিক অ্যাপ্লিকেশনের জন্য উপযুক্ত একটি সাধারণ এবং প্রমিত ইন্টারফেস প্রদান করতে একটি বিমূর্ত বেস ক্লাস ব্যবহার করতে পারে। তারপর, সেই বিমূর্ত বেস ক্লাস থেকে উত্তরাধিকারের মাধ্যমে, প্রাপ্ত ক্লাসগুলি গঠিত হয় যা একইভাবে কাজ করে।
বহিরাগত অ্যাপ্লিকেশনগুলির দ্বারা অফার করা ক্ষমতাগুলি (অর্থাৎ, পাবলিক ফাংশনগুলি) বিমূর্ত বেস ক্লাসে বিশুদ্ধ ভার্চুয়াল ফাংশন হিসাবে সরবরাহ করা হয়। এই খাঁটি ভার্চুয়াল ফাংশনগুলির বাস্তবায়নগুলি প্রাপ্ত ক্লাসগুলিতে সরবরাহ করা হয় যা অ্যাপ্লিকেশনের নির্দিষ্ট ধরণের সাথে সঙ্গতিপূর্ণ৷
এই স্থাপত্যটি সিস্টেমটি সংজ্ঞায়িত করার পরেও সহজেই একটি সিস্টেমে নতুন অ্যাপ্লিকেশন যোগ করার অনুমতি দেয়৷