Inheritance (ইনহেরিটেন্স) হল একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) ধারণা যা একটি ক্লাসকে অন্য ক্লাসের বৈশিষ্ট্য এবং আচরণ গ্রহণ করতে সক্ষম করে। এটি কোড পুনঃব্যবহারকে উন্নত করে এবং নতুন ক্লাস তৈরি করার সময় বিদ্যমান ক্লাসের বৈশিষ্ট্যগুলি ব্যবহার করতে দেয়। Dart এ ইনহেরিটেন্সকে extends কিওয়ার্ড ব্যবহার করে বাস্তবায়িত করা হয়।
1. Inheritance এর মূল ধারণা
- Super Class (Parent Class): যাকে থেকে বৈশিষ্ট্যগুলি অর্জিত হয়, তাকে সুপার ক্লাস বা প্যারেন্ট ক্লাস বলা হয়।
- Sub Class (Child Class): যেটি বৈশিষ্ট্যগুলি অর্জন করে, তাকে সাব ক্লাস বা চাইল্ড ক্লাস বলা হয়।
2. Inheritance এর উদাহরণ
ধরি, আমাদের একটি Animal ক্লাস আছে, এবং আমরা একটি Dog ক্লাস তৈরি করতে চাই যা Animal ক্লাসের বৈশিষ্ট্য এবং আচরণ গ্রহণ করবে।
সুপার ক্লাস (Super Class):
class Animal {
String name; // Property
Animal(this.name); // Constructor
void speak() {
print("$name makes a sound."); // Method
}
}
সাব ক্লাস (Sub Class):
class Dog extends Animal { // Inheriting from Animal
Dog(String name) : super(name); // Calling the superclass constructor
@override
void speak() {
print("$name barks."); // Overriding the method
}
}
3. Inheritance এর ব্যবহার
void main() {
Dog dog = Dog('Buddy'); // Creating an instance of Dog
dog.speak(); // Output: Buddy barks.
Animal animal = Animal('Generic Animal');
animal.speak(); // Output: Generic Animal makes a sound.
}
4. Multiple Inheritance
Dart সরাসরি মাল্টিপল ইনহেরিটেন্স সমর্থন করে না, কিন্তু আপনি ইন্টারফেস ব্যবহার করে এই সীমাবদ্ধতা অতিক্রম করতে পারেন।
উদাহরণ:
abstract class Swimmable {
void swim();
}
class Fish extends Animal implements Swimmable { // Implementing multiple interfaces
Fish(String name) : super(name);
@override
void swim() {
print("$name swims.");
}
}
5. Overriding Methods
সাব ক্লাসের মেথড সুপার ক্লাসের মেথডকে পুনরায় সংজ্ঞায়িত করতে পারে, যা পলিমরফিজমের একটি উদাহরণ।
class Cat extends Animal {
Cat(String name) : super(name);
@override
void speak() {
print("$name meows."); // Overriding the method
}
}
void main() {
Cat cat = Cat('Whiskers');
cat.speak(); // Output: Whiskers meows.
}
Inheritance (ইনহেরিটেন্স) হল একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) ধারণা যা একটি ক্লাসকে অন্য ক্লাসের বৈশিষ্ট্য এবং আচরণ গ্রহণ করার ক্ষমতা প্রদান করে। এটি কোড পুনঃব্যবহার এবং সফটওয়্যার স্থাপনার সহজতর করার জন্য ব্যবহৃত হয়। নিম্নলিখিত পয়েন্টগুলি ইনহেরিটেন্সের মৌলিক ধারণাগুলি তুলে ধরে:
1. Super Class (Parent Class)
- সুপার ক্লাস বা প্যারেন্ট ক্লাস হল সেই ক্লাস যা থেকে বৈশিষ্ট্যগুলি অর্জিত হয়।
- এটি সাধারণভাবে সাধারণ বৈশিষ্ট্য এবং আচরণ ধারণ করে যা সাব ক্লাসে প্রযোজ্য।
2. Sub Class (Child Class)
- সাব ক্লাস বা চাইল্ড ক্লাস হল সেই ক্লাস যা সুপার ক্লাস থেকে বৈশিষ্ট্য এবং আচরণ গ্রহণ করে।
- সাব ক্লাসে অতিরিক্ত বৈশিষ্ট্য এবং মেথড যুক্ত করা যেতে পারে।
3. Code Reusability (কোড পুনঃব্যবহার)
- ইনহেরিটেন্সের মাধ্যমে আপনি একই কোড আবার লিখতে হয় না। সাব ক্লাস সুপার ক্লাসের বৈশিষ্ট্যগুলি ব্যবহার করতে পারে, যা কোডকে আরও সংগঠিত এবং কার্যকর করে।
4. Method Overriding (মেথড ওভাররাইডিং)
- সাব ক্লাস সুপার ক্লাসের মেথডকে পুনরায় সংজ্ঞায়িত করতে পারে, যার ফলে বিভিন্ন ক্লাসে একই নামের মেথড ভিন্নভাবে কাজ করতে পারে। এটি পলিমরফিজমের অংশ।
5. Is-A Relationship (Is-A সম্পর্ক)
- ইনহেরিটেন্সে সাব ক্লাস এবং সুপার ক্লাসের মধ্যে একটি "Is-A" সম্পর্ক থাকে। অর্থাৎ, সাব ক্লাসটি সুপার ক্লাসের একটি বিশেষ ধরনের। যেমন:
- একটি
Dogক্লাস একটিAnimalক্লাসের একটি বিশেষ ধরনের।
- একটি
6. Single Inheritance vs Multiple Inheritance
- Single Inheritance: একটি সাব ক্লাস একক সুপার ক্লাস থেকে বৈশিষ্ট্য গ্রহণ করে।
- Multiple Inheritance: একটি সাব ক্লাস একাধিক সুপার ক্লাস থেকে বৈশিষ্ট্য গ্রহণ করতে পারে। (Dart সরাসরি মাল্টিপল ইনহেরিটেন্স সমর্থন করে না, তবে ইন্টারফেস ব্যবহার করে এটি সম্ভব হয়।)
উদাহরণ
সুপার ক্লাস (Animal):
class Animal {
void speak() {
print("Animal speaks");
}
}
সাব ক্লাস (Dog):
class Dog extends Animal {
@override
void speak() {
print("Dog barks");
}
}
ব্যবহার:
void main() {
Dog dog = Dog();
dog.speak(); // Output: Dog barks
}
Parent Class (সুপার ক্লাস) এবং Child Class (সাব ক্লাস) ব্যবহার করে আপনি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর বৈশিষ্ট্যগুলি ব্যবহার করে কোড পুনঃব্যবহার এবং সংগঠনের সুবিধা পেতে পারেন। নিচে Parent এবং Child Class এর ব্যবহার এবং উদাহরণসহ আলোচনা করা হলো।
. Parent Class (সুপার ক্লাস)
Parent Class হল একটি ক্লাস যা অন্যান্য ক্লাসকে বৈশিষ্ট্য এবং আচরণ প্রদান করে। এটি সাধারণ বৈশিষ্ট্য এবং মেথড ধারণ করে।
উদাহরণ:
class Product {
String name;
double price;
Product(this.name, this.price); // Constructor
void displayDetails() {
print("Product Name: $name");
print("Price: \$${price.toStringAsFixed(2)}");
}
}
Child Class (সাব ক্লাস)
Child Class হল একটি ক্লাস যা Parent Class থেকে বৈশিষ্ট্য এবং আচরণ অর্জন করে। এটি Parent Class এর মেথডগুলোকে ওভাররাইড (override) করে নতুনভাবে সংজ্ঞায়িত করতে পারে।
উদাহরণ:
class Electronics extends Product {
int warranty; // Warranty in months
Electronics(String name, double price, this.warranty) : super(name, price); // Constructor
@override
void displayDetails() {
super.displayDetails(); // Call the parent method
print("Warranty: $warranty months");
}
}
class Clothing extends Product {
String size; // Size of the clothing item
Clothing(String name, double price, this.size) : super(name, price); // Constructor
@override
void displayDetails() {
super.displayDetails();
print("Size: $size");
}
}
class Furniture extends Product {
String material; // Material of the furniture
Furniture(String name, double price, this.material) : super(name, price); // Constructor
@override
void displayDetails() {
super.displayDetails();
print("Material: $material");
}
}
Parent এবং Child Class এর ব্যবহার
void main() {
// Create instances of each product type
Product laptop = Electronics("Laptop", 999.99, 24);
Product shirt = Clothing("T-Shirt", 19.99, "M");
Product chair = Furniture("Dining Chair", 89.99, "Wood");
// Store products in a list
List<Product> products = [laptop, shirt, chair];
// Display details of each product
for (var product in products) {
product.displayDetails();
print('---------------------'); // Separator
}
}Multiple Child Classes
একটি Parent Class থেকে একাধিক Child Class তৈরি করা সম্ভব। এটি বিভিন্ন ধরনের অবজেক্ট তৈরিতে সাহায্য করে।
উদাহরণ:
// Parent Class
class Animal {
String name;
Animal(this.name);
String makeSound() {
return "Animal sound";
}
String getName() {
return name;
}
}
// Child Class: Dog
class Dog extends Animal {
Dog(String name) : super(name);
@override
String makeSound() {
return "Bark";
}
}
// Child Class: Cat
class Cat extends Animal {
Cat(String name) : super(name);
@override
String makeSound() {
return "Meow";
}
}
// Child Class: Cow
class Cow extends Animal {
Cow(String name) : super(name);
@override
String makeSound() {
return "Moo";
}
}
void main() {
// Object Creation
var dog = Dog("Buddy");
var cat = Cat("Whiskers");
var cow = Cow("Bessie");
// Method Calling
print('${dog.getName()} says ${dog.makeSound()}'); // Output: Buddy says Bark
print('${cat.getName()} says ${cat.makeSound()}'); // Output: Whiskers says Meow
print('${cow.getName()} says ${cow.makeSound()}'); // Output: Bessie says Moo
}
ব্যাখ্যা:
- Parent Class (
Animal): এখানেAnimalক্লাসটি একটি সাধারণ অবজেক্ট তৈরি করে যা একটি নাম গ্রহণ করে এবং একটি সাধারণ শব্দ তৈরি করে। - Child Classes (
Dog,Cat,Cow): এখানেDog,Cat, এবংCowক্লাসগুলিAnimalক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। তারা তাদের নিজস্ব শব্দ তৈরি করেmakeSoundমেথডের মাধ্যমে। - অবজেক্ট তৈরি এবং মেথড কল: প্রতিটি Child Class এর একটি অবজেক্ট তৈরি করা হয়েছে এবং তাদের মেথডগুলি কল করা হয়েছে।
এভাবে, Parent Class এর থেকে একাধিক Child Class তৈরি করে বিভিন্ন ধরনের অবজেক্ট তৈরি করা যায়।
Method Overriding এবং Super Constructor হল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের (OOP) দুটি গুরুত্বপূর্ণ ধারণা। এগুলি ইনহেরিটেন্সের সাথে যুক্ত এবং একটি সাব ক্লাসকে সুপার ক্লাসের বৈশিষ্ট্য ও আচরণ পরিবর্তন করার সুযোগ দেয়। নিচে বিস্তারিত আলোচনা করা হলো।
1. Method Overriding
Method Overriding হল একটি প্রক্রিয়া যেখানে সাব ক্লাসে সুপার ক্লাসের একটি মেথডের পুনরায় সংজ্ঞায়িত করা হয়। এটি পলিমরফিজমের একটি উদাহরণ এবং এটি সাব ক্লাসের নির্দিষ্ট আচরণ তৈরি করতে ব্যবহৃত হয়।
উদাহরণ:
class Animal {
void speak() {
print("Animal makes a sound.");
}
}
class Dog extends Animal {
@override
void speak() {
print("Dog barks."); // Overriding the speak method
}
}
class Cat extends Animal {
@override
void speak() {
print("Cat meows."); // Overriding the speak method
}
}
void main() {
Animal myDog = Dog();
Animal myCat = Cat();
myDog.speak(); // Output: Dog barks.
myCat.speak(); // Output: Cat meows.
}2. Super Constructor
Super Constructor হল একটি মেথড যা সাব ক্লাসের কনস্ট্রাক্টরে সুপার ক্লাসের কনস্ট্রাক্টরকে কল করার জন্য ব্যবহৃত হয়। এটি ইনহেরিটেড বৈশিষ্ট্যগুলির প্রাথমিক মান সেট করতে সাহায্য করে।
উদাহরণ:
class Animal {
String name;
// Super constructor
Animal(this.name); // Constructor with a parameter
void displayInfo() {
print("Animal Name: $name");
}
}
class Dog extends Animal {
// Subclass constructor
Dog(String name) : super(name); // Calling the super constructor
void bark() {
print("$name barks.");
}
}
void main() {
Dog myDog = Dog('Buddy'); // Creating an instance of Dog
myDog.displayInfo(); // Output: Animal Name: Buddy
myDog.bark(); // Output: Buddy barks.
}Combining Method Overriding and Super Constructor
উদাহরণ:
class Animal {
String name;
Animal(this.name); // Super constructor
void speak() {
print("$name makes a sound.");
}
}
class Dog extends Animal {
Dog(String name) : super(name); // Calling the super constructor
@override
void speak() {
print("$name barks."); // Overriding the speak method
}
}
class Cat extends Animal {
Cat(String name) : super(name); // Calling the super constructor
@override
void speak() {
print("$name meows."); // Overriding the speak method
}
}
void main() {
Animal myDog = Dog('Buddy');
Animal myCat = Cat('Whiskers');
myDog.speak(); // Output: Buddy barks.
myCat.speak(); // Output: Whiskers meows.
}
Abstract Class এবং Interface হল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের (OOP) দুটি গুরুত্বপূর্ণ ধারণা। এগুলি সফটওয়্যার ডিজাইনে নমনীয়তা এবং পুনঃব্যবহারযোগ্যতা বাড়াতে সহায়ক। নিচে প্রতিটির ব্যবহার এবং উদাহরণ সহ বিস্তারিত আলোচনা করা হলো।
1. Abstract Class
Abstract Class একটি ক্লাস যা এক বা একাধিক অ্যাবস্ট্রাক্ট মেথড (abstract methods) ধারণ করে। অ্যাবস্ট্রাক্ট মেথডগুলি এমন মেথড যা সুপার ক্লাসে সংজ্ঞায়িত করা হয় কিন্তু সাব ক্লাসে অবশ্যই প্রয়োগ করতে হয়। এটি সাব ক্লাসের জন্য একটি ব্লুপ্রিন্ট হিসেবে কাজ করে।
উদাহরণ:
abstract class Animal {
String name;
Animal(this.name); // Constructor
// Abstract method
void speak(); // No implementation, must be implemented by subclasses
}
class Dog extends Animal {
Dog(String name) : super(name); // Calling super constructor
@override
void speak() {
print("$name barks.");
}
}
class Cat extends Animal {
Cat(String name) : super(name); // Calling super constructor
@override
void speak() {
print("$name meows.");
}
}
void main() {
Animal myDog = Dog('Buddy');
Animal myCat = Cat('Whiskers');
myDog.speak(); // Output: Buddy barks.
myCat.speak(); // Output: Whiskers meows.
}
2. Interface
Dart এ একটি ক্লাস স্বাভাবিকভাবে একটি ইন্টারফেস হিসেবে কাজ করে। এটি শুধুমাত্র মেথড ঘোষণা করতে পারে এবং কোনো ডেটা বা কনস্ট্রাক্টর থাকতে পারে না। ইন্টারফেস ব্যবহার করে আপনি বিভিন্ন ক্লাসের মধ্যে সাধারণ আচরণ সংজ্ঞায়িত করতে পারেন।
উদাহরণ:
// Defining an interface
class CanFly {
void fly(); // Abstract method
}
class Bird implements CanFly {
String name;
Bird(this.name);
@override
void fly() {
print("$name is flying.");
}
}
class Airplane implements CanFly {
String model;
Airplane(this.model);
@override
void fly() {
print("$model is flying.");
}
}
void main() {
CanFly myBird = Bird('Sparrow');
CanFly myPlane = Airplane('Boeing 747');
myBird.fly(); // Output: Sparrow is flying.
myPlane.fly(); // Output: Boeing 747 is flying.
}
3. Key Differences between Abstract Classes and Interfaces
| Feature | Abstract Class | Interface |
|---|---|---|
| Implementation | Can provide default implementation | Cannot provide implementation |
| Inheritance | A class can extend only one abstract class | A class can implement multiple interfaces |
| Constructor | Can have constructors | Cannot have constructors |
| Member Types | Can have fields, methods, and getters/setters | Only method declarations |
| Use Case | When you want to provide common base functionality | When you want to enforce a contract |
Read more