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 হয়। আমরা চাইলে আমাদের মত করে মেথড ওভারলোডিং ইমপ্লিমেন্ট করতে পারি। কিন্তু তা তুলনামূলক জটিল।

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