ইনহেরিট্যান্স(Inheritance)
এই লেখায় আলোচনা করব অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের অত্যান্ত গুরুত্বপূর্ণ বিষয় Inheritance নিয়ে। এর আগে Encapsulation নিয়ে আলোচনা করেছিলাম, না পড়ে থাকলে পড়ে আসতে পারেন। এখন প্রশ্ন হচ্ছে, Inheritance কি? Inheritance অর্থ হলো উত্তরাধিকার। আর উত্তরাধিকার বলতে আমরা বুঝি সন্তান তার পিতামাতার উত্তরাধিকার। মানে পিতামাতা যা রেখে যান তাই সন্তান উত্তরাধিকারী সুত্রে পেয়ে থাকেন। অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়েও এমন টা হয়ে থাকে। একটি ক্লাস অপর একটি ক্লাস হতে তার attributes এবং methods গুলো এক্সেস করতে পারে। এটিই হচ্ছে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের Inheritance। এখানে যে ক্লাস অপর ক্লাসের attributes এবং methods গুলো এক্সেস করে তাকে বলা হয় derived class আর যে ক্লাস অপর ক্লাস কে নিজের attributes এবং methods গুলো এক্সেস করতে দেয় তাকে বলা হয় base class। নামে গুলো মনে রাখতে চেষ্টা করুন।
এখন একটা উদাহরণ দেখব, ২টা ক্লাস ক্রিয়েট করব ২ টাইপের Youtube Channel ক্রিয়েট করার ক্লাস। একটা হচ্ছে, math ক্যাটাগরির চ্যানেল ক্রিয়েট করার জন্য এবং অপরটি programming ক্যাটাগরির চ্যানেল খোলার জন্য। math ক্যাটাগরির ক্লাসে attributes থাকবে name, subscriber, total videos, এবং algebra এর ভিডিও টাইটেল গুলো রাখার জন্য একটি স্ট্রিং অ্যারে। আর method হিসেবে থাকবে constructor, subscribe, unsubcribe, addVideoTitle এবং printInfo। constructor এর কাজ আগের মতই থাকবে, name এসাইন করা। subscribe ও unsubscribe মেথডের কাজও আগের মতই। addVideoTitle ব্যবহার করে অ্যারে তে ভিডিও টাইটেল রাখব যেগুলো নতুন যোগ হচ্ছে। এখানে totalVideos এর ভ্যালু এক করে বৃদ্ধি করে দিব। অপরদিকে, programming ক্যাটাগরির ক্লাসেও একই জিনিস থাকবে শুধু ভিডিও টাইটেল গুলো রাখার জন্য অ্যারের নামটা হবে numberTheory। আগের লেখা গুলো পড়ে আসলে ক্লাস দুটো তৈরি করতে পারবেন আশাকরি কিন্তু তবুও আমি নিচে কোড দিয়ে দিচ্ছি।
class mathYtChannel { private: int subscriber; int totalVideos; string name; vector <string> algebra;
public: mathYtChannel(string Name) { name = Name; subscriber = 0; totalVideos = 0; }
void subscribe() { subscriber++; } void unsubscribe() { subscriber--; }
void addVideoTitle(string videoTitle) { totalVideos++; algebra.push_back(videoTitle); }
void printInfo() { cout << "Name: " << name << endl; cout << "Subscriber: " << subscriber << endl; cout << "Total Video: " << totalVideos << endl; cout << "Videos: " << endl; for (string &videoTitle : algebra) { cout << videoTitle << endl; } } };
class programmingYtChannel { private: int subscriber; int totalVideos; string name; vector <string> numberTheory;
public: programmingYtChannel(string Name) { name = Name; subscriber = 0; totalVideos = 0; }
void subscribe() { subscriber++; } void unsubscribe() { subscriber--; }
void addVideoTitle(string videoTitle) { totalVideos++; numberTheory.push_back(videoTitle); }
void printInfo() { cout << "Name: " << name << endl; cout << "Subscriber: " << subscriber << endl; cout << "Total Video: " << totalVideos << endl; cout << "Videos: " << endl; for (string &videoTitle : numberTheory) { cout << videoTitle << endl; } } };
int main() { mathYtChannel mario("Mario Math Channel");
// add video titles mario.addVideoTitle("algebra video 1"); mario.addVideoTitle("algebra video 2"); mario.addVideoTitle("algebra video 3");
mathYtChannel yoshi("Yoshi Programming Channel");
// add video titles yoshi.addVideoTitle("number theory video 1"); yoshi.addVideoTitle("number theory video 2");
// call print info method mario.printInfo(); yoshi.printInfo();
return 0; }
|
এই লজিকের সমস্যা হচ্ছে আরো কিছু ক্লাস যদি ক্রিয়েট করতে হয় তাহলে কি প্রতি ক্লাসের জন্যই কমন attributes ও method লিখব? কোড রিপিটেশন হয়ে যাচ্ছে। এই সমস্যা দূর করার জন্যই Inheritance। ক্লাস দুটোর কাজই কিন্তু Youtube চ্যানেল ক্রিয়েট করা মানে দুই ক্লাসের টাইপ প্রায় একই। এখন যদি YoutubeChannel নামে একটা parent বা base ক্লাস ক্রিয়েট করে তার মাঝে কমন attributes এবং methods গুলো রেখে তার থেকে সেই attributes ও methods গুলো inherit করে math ক্যাটাগরি ও programming ক্যাটাগরির ক্লাস থেকে এক্সেস করতে পারি তাহলে কিন্তু কোড রিপিটেশন অনেক কমে যাচ্ছে।
// base class class YoutubeChannel { protected: int subscriber; int totalVideos; string name;
public: YoutubeChannel(string Name) { name = Name; subscriber = 0; totalVideos = 0; }
void subscribe() { subscriber++; } void unsubscribe() { subscriber--; } };
// derived class class mathYtChannel : public YoutubeChannel{ private: vector <string> algebra; public:
mathYtChannel(string Name) : YoutubeChannel(Name) {}
void addVideoTitle(string videoTitle) { totalVideos++; algebra.push_back(videoTitle); }
void printInfo() { cout << "Name: " << name << endl; cout << "Subscriber: " << subscriber << endl; cout << "Total Video: " << totalVideos << endl; cout << "Videos: " << endl; for (string &videoTitle : algebra) { cout << videoTitle << endl; } } };
class programmingYtChannel : public YoutubeChannel{ private: vector <string> numberTheory; public:
programmingYtChannel(string Name) : YoutubeChannel(Name) {}
void addVideoTitle(string videoTitle) { totalVideos++; numberTheory.push_back(videoTitle); }
void printInfo() { cout << "Name: " << name << endl; cout << "Subscriber: " << subscriber << endl; cout << "Total Video: " << totalVideos << endl; cout << "Videos: " << endl; for (string &videoTitle : numberTheory) { cout << videoTitle << endl; } } };
int main() { mathYtChannel mario("Mario Math Channel");
// add video titles mario.addVideoTitle("algebra video 1"); mario.addVideoTitle("algebra video 2"); mario.addVideoTitle("algebra video 3");
mathYtChannel yoshi("Yoshi Programming Channel");
// add video titles yoshi.addVideoTitle("number theory video 1"); yoshi.addVideoTitle("number theory video 2");
// call print info method mario.printInfo(); yoshi.printInfo();
return 0; }
|
প্রথম লেখায় বলেছিলাম Inheritance দেখার সময় protected access modifier দেখব। এখানে base ক্লাসের attributes যদি private রাখতাম তাহলে Inherit করেও লাভ হত না। base ক্লাসের attributes গুলো derived ক্লাসে এক্সেস করতে পারতাম না। কিন্তু base ক্লাসের attributes গুলো ত public রাখাও সম্ভব না। এর জন্যই protected ব্যবহার করতে হয়। protected শুধু derived ক্লাসে তার attributes গুলো এক্সেস করতে দেয় কিন্তু এর বাইরে আর কোথাও থেকে access করতে দেয় না।
এরপর দেখেন, একটা ক্লাস থেকে কীভাবে আরেকটা ক্লাস inherite করা হয়। এখানে programmingYtChannel ক্লাসে YoutubeChannel ক্লাস কে inherit করেছি এভাবে class programmingYtChannel : public YoutubeChannel{}; এবং অবশ্যই এক্সেস মডিফাইয়ার public দিতে হয়। একই ভাবে ২য় ক্লাসেও YoutubeChannel কে inherit করেছি। এখন কমন attributes ও methods গুলো কে parent বা base ক্লাসে রেখে দেওয়া তে তা বারবার child বা derived ক্লাসে লিখতে হচ্ছে। আর দেখেন child ক্লাসে আমাকে constructor ও ইমপ্লিমেন্ট করতে হচ্ছে না। আমি parent ক্লাসের constructor ব্যবহার করেই কাজ করতে পারছি। এখন একটা বিষয় লক্ষণীয় যে, base ক্লাসের attributes আমি derived ক্লাসে ব্যবহার করতে পারলেও derived ক্লাসের attributes কিন্তু base ক্লাসে ব্যবহার করতে পারব না। যেমন, YoutubeChannel ক্লাসের totalVideos mathYtChannel ক্লাসে ব্যবহার করা গেলেও mathYtChannel ক্লাসের algebra অ্যারে YoutubeChannel ক্লাস থেকে এক্সেস করা যাবে না। উপরের উদাহরণে কোড রিপিটেশন আরো কমানো সম্ভব কিন্তু আমি করিনি child ক্লাসের জিনিসপত্র যে parent ক্লাস থেকে এক্সেস করা যায় না এটা দেখানোর জন্য। আপনি নিজের মত মডিফাই করে নিতে পারেন।
আশাকরি Inheritance কনসেপ্ট টা বুঝতে পেরেছেন। এখন আলোচনা করব Inheritance এর প্রকারভেদ নিয়ে। Inheritance ৫ প্রকার,
Single Inheritance
Multilevel Inheritance
Hierarchical Inheritance
Multiple Inheritance
Hybrid Inheritance
Single Inheritance
যদি শুধুমাত্র একটি ক্লাস অপর একটি ক্লাস কে inherit করে তাহলে তাকে Single inheritance বলে।
Single Inheritance |
Multilevel Inheritance
যদি একটি parent ক্লাস অন্য আরেকটি ক্লাসের child ক্লাস হয় তখন তাকে Multilevel inheritance বলে।
Multilevel Inheritance |
Hierarchical Inheritance
যদি একের অধিক child ক্লাসের শুধুমাত্র একটি parent ক্লাস থাকে তাহলে তাকে Hierarchical inheritance বলে।
Hierarchical Inheritance |
Multiple Inheritance
যদি একের অধিক parent ক্লাসের শুধুমাত্র একটি child ক্লাস থাকে তাহলে তাকে Multiple inheritance বলে।
Multiple Inheritance |
Hybrid Inheritance
Hybrid inheritance হচ্ছে একের অধিক টাইপের inheritance এর কম্বিনেশন। যেমন, Hierarchical inheritance এবং Multiple inheritance এর কম্বিনেশন কে Hybrid inheritance বলা যায়।
Hybrid Inheritance |
No comments