Inheritance এবং Polymorphism

Kotlin এ Object-Oriented Programming (OOP) - কটলিন (Kotlin) - Mobile App Development

371

Inheritance এবং Polymorphism

কটলিনে Inheritance এবং Polymorphism হলো অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর দুটি প্রধান কনসেপ্ট। এগুলো ব্যবহার করে আপনি কোড পুনঃব্যবহারযোগ্য, সম্প্রসারণযোগ্য, এবং আরো ফ্লেক্সিবল করতে পারেন। নিচে Inheritance এবং Polymorphism নিয়ে বিস্তারিত আলোচনা করা হলো:


১. Inheritance (ইনহেরিটেন্স)

Inheritance হলো একটি প্রক্রিয়া যার মাধ্যমে একটি ক্লাস অন্য একটি ক্লাসের প্রোপার্টি এবং মেথডগুলো ইনহেরিট করে। ইনহেরিটেন্স ব্যবহার করে আপনি কোড পুনরায় ব্যবহার করতে পারেন এবং ক্লাসের কার্যকারিতা সম্প্রসারণ করতে পারেন।

i) কটলিনে ইনহেরিটেন্স

কটলিনে একটি ক্লাস ইনহেরিট করার জন্য বেস ক্লাসটিকে open কীওয়ার্ড দিয়ে চিহ্নিত করতে হয়। ডিফল্টভাবে, কটলিনে সব ক্লাস final, অর্থাৎ ইনহেরিট করা যায় না।

উদাহরণ:

open class Animal(val name: String) {
    fun eat() {
        println("$name is eating.")
    }
}

class Dog(name: String, val breed: String) : Animal(name) {
    fun bark() {
        println("$name is barking.")
    }
}

fun main() {
    val dog = Dog("Max", "Labrador")
    dog.eat() // আউটপুট: Max is eating.
    dog.bark() // আউটপুট: Max is barking.
}

ব্যাখ্যা:

  • Animal হলো একটি ওপেন ক্লাস যা ইনহেরিট করা যাবে। এটি একটি প্রোপার্টি (name) এবং একটি মেথড (eat) ধারণ করে।
  • Dog ক্লাসটি Animal ক্লাসটি ইনহেরিট করছে এবং একটি অতিরিক্ত প্রোপার্টি (breed) এবং একটি মেথড (bark) যোগ করছে।

ii) মেথড ওভাররাইডিং

কটলিনে বেস ক্লাসের মেথড ওভাররাইড করতে হলে বেস ক্লাসের মেথডটিকে open করতে হয় এবং ডেরাইভড ক্লাসে override কীওয়ার্ড ব্যবহার করতে হয়।

উদাহরণ:

open class Animal(val name: String) {
    open fun sound() {
        println("$name makes a sound.")
    }
}

class Cat(name: String) : Animal(name) {
    override fun sound() {
        println("$name meows.")
    }
}

fun main() {
    val cat = Cat("Whiskers")
    cat.sound() // আউটপুট: Whiskers meows.
}

ব্যাখ্যা:

  • sound মেথডটি Animal ক্লাসে ওপেন করা হয়েছে।
  • Cat ক্লাসে sound মেথডটি ওভাররাইড করা হয়েছে, ফলে একই মেথড ভিন্নভাবে কাজ করছে।

২. Polymorphism (পলিমরফিজম)

Polymorphism হলো একটি ধারণা যেখানে একটি মেথড বা অবজেক্ট একাধিক ফর্ম ধারণ করতে পারে। কটলিনে Polymorphism এর মাধ্যমে আপনি একই মেথডকে বিভিন্নভাবে ইমপ্লিমেন্ট করতে পারেন এবং ভিন্ন ভিন্ন ক্লাসে একই ইন্টারফেস বা বেস ক্লাস ব্যবহার করতে পারেন।

i) মেথড ওভাররাইডিং এবং পলিমরফিজম

মেথড ওভাররাইডিং Polymorphism এর একটি উদাহরণ যেখানে বেস ক্লাসের মেথড ডেরাইভড ক্লাসে ভিন্নভাবে কাজ করে।

উদাহরণ:

open class Animal {
    open fun makeSound() {
        println("Animal makes a sound")
    }
}

class Dog : Animal() {
    override fun makeSound() {
        println("Dog barks")
    }
}

class Cat : Animal() {
    override fun makeSound() {
        println("Cat meows")
    }
}

fun main() {
    val animals: List<Animal> = listOf(Dog(), Cat())
    for (animal in animals) {
        animal.makeSound()
    }
}

ব্যাখ্যা:

  • এখানে, Animal ক্লাসে makeSound মেথড ওপেন করা হয়েছে।
  • Dog এবং Cat ক্লাসে এটি ওভাররাইড করা হয়েছে।
  • animals লিস্টে ভিন্ন ভিন্ন টাইপের অবজেক্ট (Dog এবং Cat) রাখা হয়েছে, কিন্তু তারা সবাই Animal টাইপ হিসেবে চিহ্নিত।
  • Polymorphism এর মাধ্যমে একই makeSound মেথড বিভিন্ন ফর্ম ধারণ করছে।

ii) ইন্টারফেস ব্যবহার করে Polymorphism

ইন্টারফেস ব্যবহার করে আপনি একাধিক ক্লাসে একই মেথড ইমপ্লিমেন্ট করতে পারেন, যা Polymorphism এর আরও একটি উদাহরণ।

উদাহরণ:

interface Shape {
    fun draw()
}

class Circle : Shape {
    override fun draw() {
        println("Drawing a circle")
    }
}

class Rectangle : Shape {
    override fun draw() {
        println("Drawing a rectangle")
    }
}

fun main() {
    val shapes: List<Shape> = listOf(Circle(), Rectangle())
    for (shape in shapes) {
        shape.draw()
    }
}

ব্যাখ্যা:

  • Shape ইন্টারফেসে একটি মেথড draw ডিক্লেয়ার করা হয়েছে।
  • Circle এবং Rectangle ক্লাসে draw মেথড ইমপ্লিমেন্ট করা হয়েছে।
  • shapes লিস্টে Circle এবং Rectangle উভয়ই Shape টাইপ হিসেবে চিহ্নিত।
  • Polymorphism এর মাধ্যমে একই draw মেথড বিভিন্ন ফর্ম ধারণ করছে এবং প্রিন্ট করছে।

৩. অ্যাবস্ট্রাক্ট ক্লাস (Abstract Class)

কটলিনে অ্যাবস্ট্রাক্ট ক্লাসও ইনহেরিটেন্স এবং Polymorphism এর একটি উপায়। অ্যাবস্ট্রাক্ট ক্লাস এমন একটি ক্লাস যা ইন্সট্যান্স তৈরি করা যায় না এবং এটি কিছু অ্যাবস্ট্রাক্ট মেথড ধারণ করে যেগুলো ডেরাইভড ক্লাসে ইমপ্লিমেন্ট করতে হয়।

উদাহরণ:

abstract class Vehicle(val name: String) {
    abstract fun start()
}

class Car(name: String) : Vehicle(name) {
    override fun start() {
        println("$name is starting with a key.")
    }
}

class Bike(name: String) : Vehicle(name) {
    override fun start() {
        println("$name is starting with a kick.")
    }
}

fun main() {
    val car = Car("Toyota")
    val bike = Bike("Honda")
    
    car.start() // আউটপুট: Toyota is starting with a key.
    bike.start() // আউটপুট: Honda is starting with a kick.
}

ব্যাখ্যা:

  • Vehicle হলো একটি অ্যাবস্ট্রাক্ট ক্লাস যাতে একটি অ্যাবস্ট্রাক্ট মেথড start আছে।
  • Car এবং Bike ক্লাস এই অ্যাবস্ট্রাক্ট ক্লাসটি ইনহেরিট করে এবং start মেথড ইমপ্লিমেন্ট করে।

উপসংহার

কটলিনে Inheritance এবং Polymorphism কোডের পুনঃব্যবহারযোগ্যতা, সম্প্রসারণযোগ্যতা, এবং ফ্লেক্সিবিলিটি বাড়াতে সাহায্য করে। ইনহেরিটেন্স ব্যবহার করে আপনি কোডের কার্যকারিতা বাড়াতে পারেন এবং Polymorphism এর মাধ্যমে একই মেথড বা ইন্টারফেসের বিভিন্ন ইমপ্লিমেন্টেশন তৈরি করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...