Inheritance এবং Polymorphism
Inheritance এবং Polymorphism হল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর দুইটি গুরুত্বপূর্ণ কনসেপ্ট। ডি প্রোগ্রামিং ভাষা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং সাপোর্ট করে এবং এই কনসেপ্ট দুটি ব্যবহারের মাধ্যমে আপনি কোড পুনরায় ব্যবহারযোগ্য, নমনীয় এবং কার্যকরী করতে পারেন। নিচে এই দুটি কনসেপ্টের বিস্তারিত আলোচনা করা হলো।
1. Inheritance (উত্তরাধিকার)
Inheritance বা উত্তরাধিকার হলো এমন একটি প্রক্রিয়া, যেখানে একটি নতুন ক্লাস (সাবক্লাস) একটি পূর্ববর্তী ক্লাস (প্যারেন্ট ক্লাস) থেকে বৈশিষ্ট্য এবং আচরণ গ্রহণ করে। এই প্রক্রিয়াটি কোড পুনরায় ব্যবহারযোগ্যতার সুবিধা প্রদান করে, কারণ একবার একটি ক্লাস তৈরি করার পর আপনি অন্য ক্লাসে তার বৈশিষ্ট্য বা ফাংশনালিটি ব্যবহার করতে পারেন।
উদাহরণ:
import std.stdio;
// প্যারেন্ট ক্লাস
class Animal {
string name;
this(string name) {
this.name = name;
}
void speak() {
writeln(name, " makes a sound.");
}
}
// সাবক্লাস (প্যারেন্ট ক্লাস থেকে উত্তরাধিকার লাভ)
class Dog : Animal {
this(string name) {
super(name); // প্যারেন্ট ক্লাসের কনস্ট্রাক্টর কল করা
}
// প্যারেন্ট ক্লাসের speak() মেথডকে ওভাররাইড করা
override void speak() {
writeln(name, " barks.");
}
}
void main() {
Animal animal = new Animal("Generic Animal");
animal.speak(); // আউটপুট: Generic Animal makes a sound.
Dog dog = new Dog("Buddy");
dog.speak(); // আউটপুট: Buddy barks.
}এখানে:
Animalএকটি প্যারেন্ট ক্লাস, যা একটিspeak()মেথড ধারণ করে।Dogক্লাসAnimalক্লাস থেকে উত্তরাধিকার লাভ করেছে এবংspeak()মেথডটি ওভাররাইড করেছে।super(name)ব্যবহার করে প্যারেন্ট ক্লাসের কনস্ট্রাক্টর কল করা হয়েছে।
আউটপুট:
Generic Animal makes a sound.
Buddy barks.Inheritance এর সুবিধা:
- কোড পুনঃব্যবহারযোগ্যতা: একটি ক্লাসের কোড অন্য ক্লাসে পুনরায় ব্যবহার করা যায়।
- নমনীয়তা: নতুন ক্লাস তৈরির সময় আগের ক্লাসের আচরণ ব্যবহার করা যায় এবং প্রয়োজন অনুযায়ী পরিবর্তন করা যায়।
- স্ট্রাকচার এবং সংগঠন: ক্লাসের মধ্যে সম্পর্ক স্থাপন করে কোডের সংগঠন বাড়ানো যায়।
2. Polymorphism (বহুবিধতা)
Polymorphism বা বহুবিধতা হলো এমন একটি ধারণা, যার মাধ্যমে একই নামের মেথড বা ফাংশন বিভিন্ন উপায়ে কাজ করতে পারে। এটি দুইভাবে কাজ করতে পারে:
- Method Overloading: একই নামের কিন্তু বিভিন্ন আর্গুমেন্টের সাথে ফাংশন তৈরি করা।
- Method Overriding: সাবক্লাসে প্যারেন্ট ক্লাসের মেথডকে নতুনভাবে ডিফাইন করা (যেমন, উপরের উদাহরণে
speak()মেথডের ক্ষেত্রে)।
উদাহরণ (Method Overloading):
import std.stdio;
class Calculator {
// মেথড ওভারলোডিং
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}
void main() {
Calculator calc = new Calculator();
writeln("Integer addition: ", calc.add(5, 3)); // আউটপুট: 8
writeln("Double addition: ", calc.add(5.5, 3.3)); // আউটপুট: 8.8
}এখানে:
add()মেথডের দুটি ভার্সন তৈরি করা হয়েছে, একটিintআর্গুমেন্টের জন্য এবং অন্যটিdoubleআর্গুমেন্টের জন্য।
আউটপুট:
Integer addition: 8
Double addition: 8.8উদাহরণ (Method Overriding):
import std.stdio;
class Animal {
void speak() {
writeln("Animal speaks");
}
}
class Dog : Animal {
override void speak() {
writeln("Dog barks");
}
}
void main() {
Animal a = new Animal();
a.speak(); // আউটপুট: Animal speaks
Dog d = new Dog();
d.speak(); // আউটপুট: Dog barks
}এখানে:
speak()মেথড প্যারেন্ট ক্লাসAnimalএবং সাবক্লাসDogউভয় ক্লাসেই রয়েছে।- সাবক্লাসে
speak()মেথডকেoverrideকরা হয়েছে, যার ফলে সাবক্লাসেরspeak()মেথড কাজ করবে।
আউটপুট:
Animal speaks
Dog barksPolymorphism এর সুবিধা:
- একই নামের মেথড ব্যবহার: কোডের নমনীয়তা এবং পরিষ্কারতা বৃদ্ধি পায়। বিভিন্ন ক্লাসে একই মেথডের নাম ব্যবহার করা যায়, যা কোডকে আরও সংক্ষিপ্ত এবং সহজ করে।
- কোড পুনঃব্যবহারযোগ্যতা: একই মেথড নাম ব্যবহারের মাধ্যমে বিভিন্ন ডেটা টাইপ বা ক্লাসের জন্য আলাদা আচরণ প্রাপ্ত করা যায়।
সারসংক্ষেপ
- Inheritance (উত্তরাধিকার): একটি সাবক্লাস প্যারেন্ট ক্লাসের বৈশিষ্ট্য এবং মেথড গ্রহণ করে এবং প্রয়োজন অনুযায়ী সেগুলিকে পরিবর্তন (অথবা ওভাররাইড) করতে পারে।
- Polymorphism (বহুবিধতা): একই নামের মেথড বা ফাংশন বিভিন্ন উপায়ে কাজ করতে পারে। এটি দুইভাবে হয়: মেথড ওভারলোডিং এবং মেথড ওভাররাইডিং।
এই দুটি কনসেপ্ট কোডের পুনঃব্যবহারযোগ্যতা, নমনীয়তা এবং কার্যকারিতা বাড়াতে সাহায্য করে এবং অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের মূল ভিত্তি গড়ে তোলে।
Read more