7.12 জাভাস্ক্রিপ্টে মাল্টি লেভেল ইনহেরিট্যান্স

 

আমরা জাভাস্ক্রিপ্টে prototypical ইনহেরিট্যান্স নিয়ে জেনেছি। আজ আমরা মাল্টি লেভেল ইনহেরিট্যান্স নিয়ে আলোচনা করব। আমরা জিনিসটা এইভাবে চিন্তা করতে পারি, আমাদের দাদার থেকে আমাদের বাবা সম্পতি পেয়েছে, আবার আমাদের বাবার সম্পত্তি আমরা পাবো। মাল্টি লেভেল ইনহেরিট্যান্সও তাই। আমরা প্রথমে প্রোটোটাইপ চেইন ব্যবহার করে মাল্টি লেভেল ইনহেরিট্যান্স দেখব। তারপর জাভাস্ক্রিপ্ট ক্লাস দিয়ে একই জিনিস করব।

/*
আমরা এখানে জাভাস্ক্রিপ্টের প্রোটোটাইপ চেইন ব্যবহার করে মাল্টি লেভেল ইনহেরিট্যান্স ইমপ্লিমেন্ট করেছি।
*/

let grandfather = {
   grandfatherProperty : function(){
     console.log("Grandfather's property")
   }
}

let father = {
   __proto__ : grandfather,
   fatherProperty : function(){
     console.log("Father's property")
   }
}

let son = {
   __proto__ : father,
   sonProperty : function(){
     console.log("Son's Property")
   }
}

son.grandfatherProperty();          // আউটপুটঃ Grandfather's property

 

উপরের কোডটি খেয়াল করি। prototypical ইনহেরিট্যান্স সম্পর্কে জানলে জিনিসটা আমাদের খুবই সহজ। যারা জানেন না তাদেরকে prototypical ইনহেরিট্যান্স সম্পর্কে দেখে আসতে বলব। উপরের কোডটিতে father অবজেক্ট grandfather এর সবকিছু ইনহেরিট করে, আবার son অবজেক্ট father অবজেক্টের সবকিছু ইনহেরিট করে। কাজেই, son অবজেক্ট থেকে চাইলেই father এবং grandfather এর সবকিছু এক্সেস করা যাবে।

আমরা এতক্ষণ প্রোটোটাইপ চেইন ব্যবহার করে মাল্টি লেভেল ইনহেরিট্যান্স সম্পর্কে জানলাম। এখন আমরা একই জিনিস ES6 ক্লাস দিয়ে দেখব।
আমরা জানি, জাভাস্ক্রিপ্টে প্যারেন্ট ক্লাস থেকে ইনহেরিট করার জন্য চাইল্ড ক্লাসকে এক্সটেন্ড করতে হয়। তাহলে প্যারেন্ট ক্লাসের পাবলিক আর প্রোটেক্টেড প্রোপার্টিগুলা চাইল্ড ক্লাসও পেয়ে যায়।

class Grandfather {
   grandfatherProperty(){
     console.log("Grandfather's property")
   }
}

class Father extends Grandfather {
   fatherProperty(){
     console.log("Father's property")
   }
}

class Son extends Father {
   sonsProperty(){
     console.log("Son's property")
   }
}

const son = new Son();
son.grandfatherProperty()          // আউটপুটঃ Grandfather's property

 

দেখা যাচ্ছে, son নামের একটি instance তৈরি করা হয়েছে Son ক্লাস থেকে। এই অবজেক্টটি থেকে আমরা তার প্যারেন্ট এবং গ্র্যান্ডপ্যারেন্টের প্রপার্টি এক্সেস করতে পারছি। এটাই মাল্টি লেভেল ইনহেরিট্যান্স। আশা করি জাভাস্ক্রিপ্টে মাল্টি লেভেল ইনহেরিট্যান্স সম্পর্কে আমাদের ধারণা পরিষ্কার হয়েছে।

 

 

 

 
উদাহরন
  • নিচের উদাহরণটি জাভাস্ক্রীপ্টে ইনহেরিটেন্সের খুবই সহজ একটি উদাহরণ।

class Car {
  constructor(brand) {
    this.carname = brand;
  }
  present() {
    return 'I have a ' + this.carname;
  }
}

class Model extends Car {
  constructor(brand, mod) {
    super(brand);
    this.model = mod;
  }
  show() {
    return this.present() + ', it is a ' + this.model;
  }
}

let myCar = new Model("Ford", "Mustang");
  • যখন আমরা super কিওয়ার্ড ব্যবহার করি, তখন এটি প্যারেন্ট ক্লাসের প্রপার্টি বুঝায়।

class Person { 
    constructor(name) {
        this.name = name;
    }

    greet() {
        console.log(`Hello ${this.name}`);
    }
}

class Student extends Person {

    constructor(name) {
        console.log("Creating student class");
        super(name);
    }

}

let student1 = new Student('Jack');
student1.greet();
  • চাইল্ড ক্লাস চাইলে খুৱ সহজেই প্যারেন্টের প্রপার্টি ওভাররাইড করতে পারে:

class Person { 
    constructor(name) {
        this.name = name;
        this.occupation = "unemployed";
    }
    
    greet() {
        console.log(`Hello ${this.name}.`);
    }
 
}

class Student extends Person {

    constructor(name) {
        super(name);
        this.occupation = 'Student';
    }
    
    greet() {
        console.log(`Hello student ${this.name}.`);
        console.log('occupation: ' + this.occupation);
    }
}

let p = new Student('Jack');
p.greet();

 

এসো নিজে করি
  • নিচের কোড স্নিপেটের আউটপুট কি হবে?

function Person(firstName, lastName) {
    this.FirstName = firstName || "unknown";
    this.LastName = lastName || "unknown";            
}

Person.prototype.getFullName = function () {
    return this.FirstName + " " + this.LastName;
}
function Student(firstName, lastName, schoolName, grade)
{
    Person.call(this, firstName, lastName);

    this.SchoolName = schoolName || "unknown";
    this.Grade = grade || 0;
}
Student.prototype = new Person();
Student.prototype.constructor = Student;

var std = new Student("James","Bond", "XYZ", 10);
            
console.log(std.getFullName());
  • নিচের কোড স্নিপেটের আউটপুট কি হবে?
let animal = {
  name: "Animal",
  eat() {
    console.log(`${this.name} eats.`);
  }
};

let rabbit = {
  __proto__: animal,
  name: "Rabbit",
  eat() {
    this.__proto__.eat.call(this);
  }
};

rabbit.eat();
  • নিচের কোড স্নিপেটের আউটপুট কি হবে?
let animal = {
  name: "Animal",
  eat() {  
    console.log(`${this.name} eats.`);
  }
};

let rabbit = {
  __proto__: animal,
  name: "Rabbit",
  eat() {   
    super.eat();
  }
};

let longEar = {
  __proto__: rabbit,
  name: "Long Ear",
  eat() {
    super.eat();
  }
};

longEar.eat();
  • নিচের কোড স্নিপেটের আউটপুট কি হবে?
let animal = {
  sayHi() {
    alert(`I'm an animal`);
  }
};

let rabbit = {
  __proto__: animal,
  sayHi() {
    super.sayHi();
  }
};

let plant = {
  sayHi() {
    alert("I'm a plant");
  }
};

let tree = {
  __proto__: plant,
  sayHi: rabbit.sayHi 
};

tree.sayHi();