7.9 জাভাস্ক্রিপ্টে পলিমরফিজম

 

পলিমরফিজম শব্দটির বাংলা অর্থ ভিন্নরূপ। অর্থাৎ কোন জিনিসের ভিন্ন ভিন্ন রূপকেই পলিমরফিজম বলে। এখানেও তাই। আমরা বিভিন্ন কাজের জন্য ফাংশন তৈরি করি। এমন ধরণের ফাংশন তৈরি করা লাগতে পারে যেগুলা ভিন্ন ভিন্ন কাজ করে। যেমন একই ফাংশন কিন্তু দুইটি প্যারামিটার নিয়ে একরকম কাজ করে আর তিনটি প্যারামিটার নিয়ে আরেকরকম কাজ করে। আবার এমনো হতে পারে যে অনেকগুলা ফাংশন মিলে একই কাজ করছে। পলিমরফিজমে ফাংশন বা মেথডকে ভিন্ন কাজে ব্যবহার করা হয় সাধারণত দুইটি নিয়মে। সেগুলো হচ্ছেঃ

১। Method Overriding
২। Method Overloading

Method Overriding (মেথড ওভাররাইডিং)

এখানে আমরা জাভাস্ক্রিপ্ট ক্লাসের মাধ্যমে উদাহরণ দিয়েছি, এটা চাইলে প্রোটোটাইপ-বেসড এপ্রোচেও করা যায়। মেথড ওভাররাইডিং-এ চাইল্ড ক্লাস প্যারেন্ট ক্লাসের মেথডকে override করে। মানে চাইল্ড ক্লাস চাইলে প্যারেন্ট ক্লাসের মেথডের কাজের পরিবর্তন করতে পারে। নিচের কোডটি দেখলে আশা করি আপনাদের ধারণা পরিষ্কার হবে।

class Dog {
   constructor(name, age){
      this.name = name;
      this.age = age;
   }
   bark (){
      console.log("Dog barking");
   }
}

class HuskyDog extends Dog {
   constructor(name, age){
     super(name, age);
   }
   bark(){
     console.log("Husky dog barking")
   }
   play () {
     console.log(this.name+ " is playing");
   }
}

const hachi = new HuskyDog("Hachi", 2);
hachi.bark();                 // Output: Husky dog barking
hachi.play();                 // Output: Hachi is playing

 

এখানে HuskyDog ক্লাসটি প্যারেন্ট ক্লাস Dog কে ইনহেরিট করে। তার মানে প্যারেন্ট ক্লাসের bark মেথডটিও তার হয়ে যাবে। কিন্তু সে তার নিজের ক্লাসের মধ্যেই bark মেথডটি আলাদা ভাবে বানায়। যার কারণে bark মেথডটি এখানে override হয়ে যাবে। এভাবে চাইলে আমরা ইনহেরিটেড মেথড override করতে পারি।

Method Overloading (মেথড ওভারলোডিং)

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

class Dog {
   constructor(name, age){
     this.name = name;
     this.age = age;
   }
   bark (){
     console.log("Dog barking");
   }
   play(){
     console.log(this.name+" is playing")
   }
   play(partner){
     console.log(this.name+" is playing with "+ partner)
   }
   play(partner1, partner2){
     console.log(this.name+" is playing with "+ partner1+ " and "+partner2)
   }
}

const hachi = new Dog("Hachi", 2);
hachi.play();                         // Output: Hachi is playing with undefined and undefined
hachi.play("Broley");                 // Output: Hachi is playing with Broley and undefined
hachi.play("Broley", "Bravo");        // Output: Hachi is playing with Broley and Bravo

 

এখানে আমরা একই নামের মেথড play কে দিয়ে ভিন্ন রকমের কাজ করিয়েছি। কিন্তু আউটপুটে undefined হওয়ার কারণ হল, অন্যান্য ল্যাংগুয়েজের মতো জাভাস্ক্রিপ্ট মেথড ওভারলোডিং সাপোর্ট করে না। এইটা কি কারণে হয় বলেন দেখি! এইটা হয় hoisting এর জন্য। কারণ জাভাস্ক্রিপ্টে ফাংশন ডিক্ল্যারেশন hoisted হয়। আমরা চাইলে আমাদের মত করে মেথড ওভারলোডিং ইমপ্লিমেন্ট করতে পারি। কিন্তু তা তুলনামূলক জটিল।

আজ এই পর্যন্তই। আশা করি পলিমরফিজমের ধারণা আমাদের পরিষ্কার হয়েছে।

 

 

উদাহরন

উদাহরণ-১:

class Vehicle {
  constructor(brand, model) {
    this.brand = brand;
    this.model = model;
  }
  run() {
    console.log('Vehicle is running...');
  }
  turnLightsOn() {
    console.log('Lights on.');
  }
}

class Car extends Vehicle {
  constructor(brand, model) {
    super(brand, model);
  }
  run() {
    console.log(`The ${this.brand} ${this.model} car is running...`);
  }
}

const myCar = new Car('Lumbergini', 'X22');
myCar.run();    // The Lumbergini X22 car is running...
myCar.turnLightsOn();    // Lights on.

 

উদাহরণ-২:

class Database {
  dbName = '';
  dbPassword = '';
  constructor(dbName, dbPass) {
    this.dbName = dbName;
    this.dbPassword = dbPass;
  }
  connectionMsg() {
    console.log('Database connected...');
  }
  errorMsg() {
    console.log('There is a problem while trying to connect with database.');
  }
}

class PythonDB extends Database {
  constructor(dbName, dbPass) {
    super(dbName, dbPass);
  }
  connect(dbName, dbPass) {
    if ((this.dbName === dbName) && (this.dbPassword === dbPass)) {
      this.connectionMsg();
    } else {
      this.errorMsg();
    }
  }
}

const companyDB = new PythonDB('vivasoft', '1234');
companyDB.connect('vivasoft', '1425');    // There is a problem while trying to connect with database.
companyDB.connect('vivasoft', '1234');    // Database connected...

 

উদাহরণ-৩:

class Animal {
  constructor(type, name) {
    this.type = type;
    this.name = name;
  }
  isAnimal() {
    return true;
  }
  fly() {
    console.log('Can not fly');
  }
}

class Pigeon extends Animal {
  constructor(type, name, color) {
    super(type, name);
    this.color = color
  }
  fly() {
    console.log('This bird can fly.');
  }
}

const myPet = new Pigeon('Bird', 'Raja', 'White');
myPet.fly();    // This bird can fly.
console.log(myPet.isAnimal());    // true

 

এসো নিজে করি
  • একটা ক্লাসের যে কোন একটি মেথডকে Override করে দেখাও।
  • মেথড Override করার মাধ্যমে ক্লাসের প্রোপার্টি পরিবর্তন করে দেখাও।
  • মনেকর একটি ক্লাসের কোন একটি মেথড true রিটার্ন করে। এই ক্লাসকে extend করার পর ঐ একই মেথডকে কল করলে false রিটার্ন করবে। কাজটি তুমি কিভাবে করবে?
  • মনেকর class2 দ্বারা class1 কে extend করলে। আবার class3 দ্বারা class2 কে extend করলে। এখন class3 এর মধ্যে class1 ও class2 এর একটি করে মেথড Override করে দেখাও।