Vivasoft-logo

ইনহেরিটেন্সের প্রকারভেদ

ইনহেরিটেন্স ৫ প্রকার হয়ে থাকেঃ

  1. সিঙ্গেল ইনহেরিটেন্স
  2. মাল্টিলেভেল ইনহেরিটেন্স
  3. মাল্টিপল ইনহেরিটেন্স
  4. হায়ারার্কিকাল ইনহেরিটেন্স
  5. হাইব্রিড ইনহেরিটেন্স

সিঙ্গেল ইনহেরিটেন্স (Single Inheritance)

কোনো একটি সাবক্লাস যদি একটি এবং কেবল মাত্র একটি সুপারক্লাস থেকে ইনহেরিট করে তাহলে তাকে সিঙ্গেল ইনহেরিটেন্স বলে।

single

public class Animal
{
    public void Eat()
    {
        Console.WriteLine(“The animal is eating.”);
    }
}
public class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine(“The dog is barking.”);
    }
}
public class Program
{
    static void Main()
    {
        Dog myDog = new Dog();
        myDog.Eat();
        myDog.Bark();
    }
}
class Animal {
    public void eat() {
        System.out.println(“The animal is eating.”);
    }
}
class Dog extends Animal {
    public void bark() {
        System.out.println(“The dog is barking.”);
    }
}
public class Program {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.eat();
        myDog.bark();
    }
}

Output:

The animal is eating.
The dog is barking.

উপরের উদাহরণে Dog ক্লাস শুধু মাত্র Animal ক্লাস থেকে ইনহেরিট করে থাকে এই ছাড়া অন্য কারো কাছ থেকে ইনহেরিট করেনাহ আবার Animal ক্লাস বেজ ক্লাস অন্য কোনো ক্লাস থেকে ইনহেরিট করে নাহ। এই জন্য এইটাকে আমরা সিঙ্গেল ইনহেরিটেন্স বলতে পারি।

মাল্টিলেভেল ইনহেরিটেন্স (Multilevel Inheritance)

কোনো একটা ক্লাসের প্যারেন্ট ক্লাস যদি অন্য একটা ক্লাসকে ইনহেরিট করে থাকে তাহলে এই সম্পর্ককে মাল্টিলেভেল ইনহেরিটেন্স বলে থাকে।

multiple_inheritance

public class Animal
{
    public void Eat()
    {
        Console.WriteLine(“The animal is eating.”);
    }
}
public class Mammal : Animal
{
    public void GiveBirth()
    {
        Console.WriteLine(“The mammal is giving birth.”);
    }
}
public class Dog : Mammal
{
    public void Bark()
    {
        Console.WriteLine(“The dog is barking.”);
    }
}
public class Program
{
    static void Main()
    {
        Dog myDog = new Dog();
        myDog.Eat();
        myDog.GiveBirth();
        myDog.Bark();
    }
}
class Animal {
    public void eat() {
        System.out.println(“The animal is eating.”);
    }
}
class Mammal extends Animal {
    public void giveBirth() {
        System.out.println(“The mammal is giving birth.”);
    }
}
class Dog extends Mammal {
    public void bark() {
        System.out.println(“The dog is barking.”);
    }
}
public class Program {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.eat();
        myDog.giveBirth();
        myDog.bark();
    }
}

Output:

The animal is eating.
The mammal is giving birth.
The dog is barking.

উপরের উদাহরণে Dog ক্লাস, Mammal ক্লাসকে ইনহেরিট করছে। এই ক্ষেত্রে Mammal ক্লাস, Dog ক্লাস এর প্যারেন্ট ক্লাস বা বেজ ক্লাস। আবার Mammal ক্লাস, Animal ক্লাস কে ইনহেরিট করছে।

এইখানে Dog ক্লাস এর বেজ ক্লাস নিজেও অন্য একটা ক্লাসকে ইনহেরিট করছে। এই জন্য আমরা এইটাকে মাল্টিলেভেল ইনহেরিটেন্স বলতে পারি।

মাল্টিপল ইনহেরিটেন্স (Multiple Inheritance)

একটি ক্লাস যদি একাধিক ক্লাস থেকে ইনহেরিট করে থাকে তাহলে সেইটাকে আমরা মাল্টিপল ইনহেরিটেন্স বলি।

multiple_inheritance

C# এবং Java মাল্টিপল ইনহেরিটেন্স সাপোর্ট করে নাহ। C# এবং Java তেআমাদের যদি মাল্টিপল ইনহেরিটেন্সের প্রয়োজন সেই ক্ষেত্রে আমরা ইন্টার্ফেস ইমপ্লিমেন্টের মাধ্যমে এইটা করে থাকি।227-83

interface IEater
{
    void Eat();
}
interface ISleeper
{
    void Sleep();
}
public class Dog : IEater, ISleeper
{
    public void Eat()
    {
        Console.WriteLine(“The dog is eating.”);
    }
    public void Sleep()
    {
        Console.WriteLine(“The dog is sleeping.”);
    }
    public void Bark()
    {
        Console.WriteLine(“The dog is barking.”);
    }
}
public class Program
{
    static void Main()
    {
        Dog myDog = new Dog();
        myDog.Eat();
        myDog.Sleep();
        myDog.Bark();
    }
}
interface IEater {
    void eat();
}
interface ISleeper {
    void sleep();
}
class Dog implements IEater, ISleeper {
    @Override
    public void eat() {
        System.out.println(“The dog is eating.”);
    }
    @Override
    public void sleep() {
        System.out.println(“The dog is sleeping.”);
    }
    public void bark() {
        System.out.println(“The dog is barking.”);
    }
}
public class Program {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.eat();
        myDog.sleep();
        myDog.bark();
    }
}

Output:

The dog is eating.
The dog is sleeping.
The dog is barking.

উপরিউক্ত উদাহরণে Dog ক্লাস টা ISleeper এবং IEater ইন্টার্ফেস কে ইমপ্লিমেন্ট করে থাকে। এইক্ষেত্রে Dog ক্লাস ২ টা ক্লাস থেকে ইনহেরিট করছে। সেইজন্য এইটা মাল্টিপল ইনহেরিটেন্স।

ডায়ামন্ড প্রব্লেম (Diamond Problem)

আমাদের কাছে ৪ টা ক্লাস আছে, ClassA, ClassB, ClassC এবং ClassD এদের মধ্যে সম্পর্ক হলো ClassB এবং ClassC উভয় ক্লাস, ClassA কে ইনহেরিট করে থাকে। আবার ClassD ইনহেরিট করে ClassB এবং ClassC উভয় ক্লাসকে। ClassA, ClassB, ClassC এবং ClassD এর মধ্যে সম্পর্ক নিম্নরুপঃ

diamond

এখন যদি ClassA তে এমন কোনো মেথোড থাকে যেটা ClassB এবং ClassC উভয়ই Override করে থাকে তাহলে যখন ClassD যখন ওই মেথোড টা কল করা হবে তখন সেইটা ClassC থেকে নিবে নাকি ClassB থেক। কারণ, ওই মেথোড টা উভয় ক্লাস Override করেছে। এই প্রব্লেমটাকে অব্জেক্ট অরিয়েন্টেড প্রোগ্রামিং এ ড্যামন্ড প্রবলেম বলে থাকে।

class A
{
    public virtual void CommonMethod()
    {
        Console.WriteLine(“A’s implementation of CommonMethod”);
    }
}
class B : A
{
    public override void CommonMethod()
    {
        Console.WriteLine(“B overriding class A’s CommonMethod”);
    }
}
class C : A
{
    public override void CommonMethod()
    {
        Console.WriteLine(“C overriding class A’s CommonMethod”);
    }
}
class D : B, C
{
}
class Program
{
    static void Main()
    {
        D instanceOfD = new D();
        instanceOfD .CommonMethod();
    }
}
interface CommonInterface {
    void commonMethod();
}
class A implements CommonInterface {
    @Override
    public void commonMethod() {
        System.out.println(“A’s implementation of CommonMethod”);
    }
}
class B extends A {
    @Override
    public void commonMethod() {
        System.out.println(“B overriding class A’s CommonMethod”);
    }
}
class C extends A {
    @Override
    public void commonMethod() {
        System.out.println(“C overriding class A’s CommonMethod”);
    }
}
class D extends B implements CommonInterface {
    // D inherits from B and implements CommonInterface
}
public class Program {
    public static void main(String[] args) {
        D instanceOfD = new D();
        instanceOfD.commonMethod();
    }
}

উপরিক্ত কোড স্যামপলের আউটপুট কি হবে? instanceOfD .CommonMethod() এইটা কল করা হলে কোন মেথোডটা এক্সেকিউট হবে? B ক্লাস এ যেটা Override করা হইসে নাকি C ক্লাস যেইটা Override করা হইসে?

এই প্রব্লেমটাকে বলা হয় ডায়ামন্ড প্রব্লেম। এই প্রব্লেমটা সল্ভ করার জন্য একেকটা ল্যাঙ্গুয়েজ একটা পদ্ধতি অবলম্বন করেছে। C#, Java যেনো এই প্রব্লেম নাহ হয় সেই জন্য C#, Java ইন্টার্ফেস ছাড়া মাল্টিপল ইনহেরিটেন্স সাপোর্ট করে নাহ। উপরিউক্ত কোডের জন্য C# কম্পাইলেশন ইরোর দেখাবে। মাল্টিপল ইনহেরিটেন্স করতে হলে আমরা সর্বোচ্চ একটা নরমাল ক্লাস এবং বাকি গুলা অবশ্যই ইন্টার্ফেস ক্লাস হতে হবে। যেহেতু ইন্টার্ফেস ক্লাস থাকবে সেই জন্য D ক্লাস তে অবশ্যই মেথোড গুলা ইমপ্লিমেন্ট করতে হবে।

উপরিউক্ত সমস্যাটা ডায়ামন্ড প্রব্লেম এ যেনো না পরতে হয় সেইভাবে একটা সল্যুশন দেওয়া হলোঃ

interface IA
{
    void CommonMethod();
}
class A : IA
{
    public void CommonMethod()
    {
        Console.WriteLine(“A’s implementation of CommonMethod”);
    }
}
class B : IA
{
    public void CommonMethod()
    {
        Console.WriteLine(“A’s implementation of CommonMethod”);
    }
}
class C : IA
{
    public void CommonMethod()
    {
        Console.WriteLine(“A’s implementation of CommonMethod”);
    }
}
class D : B, IA
{
    public new void CommonMethod()
    {
        Console.WriteLine(“D’s implementation of CommonMethod”);
    }
}
class Program
{
    static void Main()
    {
        D d = new D();
        d.CommonMethod();
    }
}
interface IA {
    void commonMethod();
}
class A implements IA {
    @Override
    public void commonMethod() {
        System.out.println(“A’s implementation of CommonMethod”);
    }
}
class B implements IA {
    @Override
    public void commonMethod() {
        System.out.println(“A’s implementation of CommonMethod”);
    }
}
class C implements IA {
    @Override
    public void commonMethod() {
        System.out.println(“A’s implementation of CommonMethod”);
    }
}
class D extends B implements IA {
    @Override
    public void commonMethod() {
        System.out.println(“D’s implementation of CommonMethod”);
    }
}
public class Program {
    public static void main(String[] args) {
        D d = new D();
        d.commonMethod();
    }
}

Output:

D’s implementation of CommonMethod
হায়ারার্কিকাল ইনহেরিটেন্স (Hierarchical Inheritance)

একজন বাবার যদি একাধিক সন্তান থাকে সেই ক্ষেত্রে সবাই বাবার সম্পত্তি ইনহেরিট করে থাকে। এই বিষয়টাকে OOP তে হায়ারার্কিকাল ইনহেরিটেন্স বলে।

একটি ক্লাসকে যদি একাধিক ক্লাস ইনহেরিট করে, সেইটাকে আমরা হায়ারার্কিকাল ইনহেরিটেন্স বলে থাকি।

hierarchical

public class Animal
{
    public void Eat()
    {
        Console.WriteLine(“The animal is eating.”);
    }
}
public class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine(“The dog is barking.”);
    }
}
public class Cat : Animal
{
    public void Meow()
    {
        Console.WriteLine(“The cat is meowing.”);
    }
}
public class Program
{
    static void Main()
    {
        Dog myDog = new Dog();
        Cat myCat = new Cat();
        myDog.Eat();
        myCat.Eat();
        myDog.Bark();
        myCat.Meow();
    }
}
class Animal {
    public void eat() {
        System.out.println(“The animal is eating.”);
    }
}
class Dog extends Animal {
    public void bark() {
        System.out.println(“The dog is barking.”);
    }
}
class Cat extends Animal {
    public void meow() {
        System.out.println(“The cat is meowing.”);
    }
}
public class Program {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        Cat myCat = new Cat();
        myDog.eat();
        myCat.eat();
        myDog.bark();
        myCat.meow();
    }
}

Output:

The animal is eating.
The animal is eating.
The dog is barking.
The cat is meowing.

উপরিউক্ত উদাহরণে Animal ক্লাস কে Dog ক্লাস এবং Cat ক্লাস ইনহেরিট করেছে। যেহেতু একটি ক্লাসকে ২ টা ক্লাস ইনহেরিট করেছে সেই জন্য এইটাকে হায়ারার্কিকাল ইনহেরিটেন্স বলে থাকি।

হাইব্রিড ইনহেরিটেন্স (Hybrid Inheritance)

আমরা এখন পর্যন্ত সিঙ্গেল ইনহেরিটেন্স, মাল্টিপল ইনহেরিটেন্স, মাল্টিলেভেল ইনহেরিটেন্স এবং হায়ারার্কিকাল ইনহেরিটেন্স ইনহেরিটেন্স নিয়ে আলোচনা করলাম। এর মধ্যে একাধিক ইনহেরিটেন্স টাইপ নিয়ে যদি একটা ইনহেরিটেন্স রিলেশন গঠন হয় তাহলে সেইটাকে হাইব্রিড ইনহেরিটেন্স বলে থাকে।

hybrid

public class Animal
{
    public void Eat()
    {
        Console.WriteLine(“The animal is eating.”);
    }
}
interface ISound
{
    void MakeSound();
}
public class Dog : Animal, ISound
{
    public void MakeSound()
    {
        Console.WriteLine(“The dog is barking.”);
    }
}
public class Cat : Dog
{
    public void Purr()
    {
        Console.WriteLine(“The cat is purring.”);
    }
}
public class Bird : ISound
{
    public void MakeSound()
    {
        Console.WriteLine(“The bird is singing.”);
    }
}
public class Program
{
    static void Main()
    {
        Dog myDog = new Dog();
        Cat myCat = new Cat();
        Bird myBird = new Bird();
        myDog.Eat();
        myDog.MakeSound();
        myCat.Eat();
        myCat.MakeSound();
        myCat.Purr();
        myBird.MakeSound();
    }
}
class Animal {
    public void eat() {
        System.out.println(“The animal is eating.”);
    }
}
interface ISound {
    void makeSound();
}
class Dog extends Animal implements ISound {
    @Override
    public void makeSound() {
        System.out.println(“The dog is barking.”);
    }
}
class Cat extends Dog {
    public void purr() {
        System.out.println(“The cat is purring.”);
    }
}
class Bird implements ISound {
    @Override
    public void makeSound() {
        System.out.println(“The bird is singing.”);
    }
}
public class Program {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        Cat myCat = new Cat();
        Bird myBird = new Bird();
        myDog.eat();
        myDog.makeSound();
        myCat.eat();
        myCat.makeSound();
        myCat.purr();
        myBird.makeSound();
    }
}

Output:

The animal is eating.
The dog is barking.
The animal is eating.
The dog is barking.
The cat is purring.
The bird is singing.

উপরের উদাহরণে দেখা যাচ্ছে Dog ক্লাস টা Animal ক্লাস এবং ISound ইন্টার্ফেস কে ইমপ্লিমেন্ট করেছে। এইক্ষেত্রে Dog ক্লাস মাল্টিপল ইনহেরিটেন্স। আবার Cat ক্লাস টা Dog ক্লাস কে ইনহেরিট করেছে। যেটা কিনা সিঙ্গেল ইনহেরিটেন্স। এই ক্ষেত্রে এইখানে ২ তা ইনহেরিটেন্স টাইপ ব্যাবহার করা হয়েছে। এইটাকে আমরা হাইব্রিড ইনহেরিটেন্স বলতে পারি।

এসো নিজে করি

মনে করি আমাদের একটা ব্যংকিং সিস্টেম ডিজাইন করতে হবে যেটা কিনা বিভিন্ন ধরণের ব্যাংক একাউন্ট নিয়ে কাজ করতে পারে। যাদের প্রত্যেকের নিজস্ব কিছু বৈশিষ্ট্য এবং আচরণ রয়েছে। এই সিস্টেমে বিভিন্ন ধরনের অ্যাকাউন্ট যেমন ফিক্সড ডিপোজিট একাউন্ট (FixedDepositeAccount), সেভিংস অ্যাকাউন্ট (SavingsAccount) ,ইত্যাদির সাপোর্ট থাকবে। যাইহোক, এই বিভিন্ন ধরনের অ্যাকাউন্টগুলির স্বতন্ত্র বৈশিষ্ট্য এবং ক্রিয়াকলাপ রয়েছে, যা একটি ফ্লেক্সিবল এবং রক্ষণাবেক্ষণযোগ্য কোডবেস তৈরি করা কে চ্যালেঞ্জিং করে তোলে।

আমরা কীভাবে একটি ব্যাঙ্কিং সিস্টেম ডিজাইন করতে পারি যা বিভিন্ন ধরনের ব্যাংক অ্যাকাউন্ট নিয়ে কাজ করতে পারবে কিন্তু কোডের ডুপ্লিকেশন এড়াবে, এক্সটেনসিবিলিটি নিশ্চিত করতে এবং সব ধরনের অ্যাকাউন্ট তাদের নিজস্ব কাজ সম্পাদন করতে পারবে?

যা শিখলাম

  1. ইনহেরিটেন্সের ধারণা
  2. ইনহেরিটেন্সের প্রকারভেদ
  3. ইনহেরিটেন্সের সুবিধা
  4. ইনহেরিটেন্সের ব্যাবহার