Tuesday, March 27, 2018

অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং - ৫ঃ পলিমরফিজম

পলিমরফিজম মানেই হল বহুরূপতা। অথ্যাৎ, একই এলিমেন্ট নানান ধরনের বিহ্যাভিওয়্যার দেখায়। আমরা জানি, একই নামের মেথড একবারের বেশী লিখা যায় না। কিন্তু অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এ প্যারামিটারের ভিন্নতার উপর ভিত্তি করে দুই বা ততোধিক একই নামের মেথড লিখা যায়। আবার তুমি চাইলে প্যারেন্ট ক্লাসের মেথড চাইল্ড ক্লাসের কোন মেথড দ্বারা ওভাররাইড করতে পারো। এই বিষয়গুলোর উপর ভিত্তি করে অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এ পলিমারফিজম ২ ভাগে ভাগ করা যায়-

ওভারলোডিংঃ ওভারলোডিং হল একই মেথড নেম কিন্তু ভিন্ন ভিন্ন প্যারামিটার। মাঝে মাঝে প্রোগ্রামিং করার সময় আমাদের এমন অবস্থা তৈরী হয় যে, কয়েকটা মেথডের ভিন্ন ভিন্ন প্যারামিটার দরকার হয় কিন্তু একই কাজ করে। সেক্ষেত্রে একই নাম ব্যবহার করা সবচেয়ে ভালো প্র্যাক্টিস। আর সেজন্যই ওভারলোডিং জিনিসটা রাখা হয়েছে OOP তে।

যেমন ধরো,আমাদের যোগ করা দরকার। আমার কখনো ২ নাম্বার যোগ করার দরকার পড়ে, কখনো ৩ টা আবার কখনো ৪ টা। এই কাজটি আমরা মেথড দিয়ে করতে চাই।  আমরা জানি মানুষ চিন্তা করতে পারে।  তার মানে মানুষ যোগ করতে পারে। তাহলে আগের পর্বের মানুষের যে Think() নামক মেথডটা লিখছিলাম সেটা দিয়েই কাজটা সারতে পারি। দেখো কাজটা আমরা কিভাবে করি :P
 public class Human extends Animal {  
      double sum;  
      public void think()  
      {    
           System.out.println("Wanna see that I can think?")
           System.out.println("Give me some number and see I can do sum");  
      }  
      public void think(double a , double b)  
      {  
           sum = a+b;  
           System.out.println(sum);  
      }  
      public void think(double a , double b, double c)  
      {  
           sum = a+b+c;  
           System.out.println(sum);  
      }  
      public void think(double a , double b, double c, double d)  
      {  
           sum = a+b+c+d;  
           System.out.println(sum);  
      }  
 }  
 public class StartUp {  
      public static void main(String[] args) {  
           Human human1 = new Human();  
           human1.think();  
           human1.think(30,40);  
           human1.think(30,40,50);  
           human1.think(50,60,70,80);  
      }  
 }  
সবগুলো মেথডের নামই সেইম। তবে তাদের আলাদা আলাদা প্যারামিটার। কোন মেথডটা কল হবে তা নির্ভর করে ৩ টা জিনিসের উপর-
১। মোট প্যারামিটার সংখ্যা ।
২। প্যারামিটারের ডাটা টাইপ।
৩। ডাটা টাইপের সিকুয়েন্স।
এই তিনটা জিনিস যে মেথডের সাথে মিলবে সেই মেথডটাই কল হবে।

 OUTPUT
 Wanna see that, I can calculate?  
 Give some number and see I can add  
 70.0  
 120.0  
 260.0  

উপরে আমি যদি মেইন ফাংশ থেকে জিরো প্যারামিটার কল করি তাহলে প্রথম মেথডটা কল হবে, আবার ৪ টা ডাবল টাইপ প্যারামিটার দিয়ে কল করি তাহলে শেষেরটা কল হবে। তবে অন্য কোন ডাটা টাইপ দিয়ে কল করলে কোনটাই কল হবেনা। আশা করি বুঝতে সমস্যা হচ্ছেনা।

ওভাররাইডিংঃ 


উপরে দেখা যাচ্ছে, Animal ক্লাসকে Human এবং Dog ক্লাস Inherit করেছে।  Animal ক্লাসের ভিতর Walk এবং Call মেথড লিখা আছে। কিন্তু একটা সময় পর তোমার মনে হল Animal ক্লাসের মেথডটি Human বা Dog ক্লাসের জন্য পর্যাপ্ত না অথবা সাবক্লাস দুটোতে সেটার সংশোধন করা দরকার সেক্ষেত্রে তুমি সেই মেথডটাই সাবক্লাসে লিখে দিবে। তখন সাবক্লাসের জন্য Animal ক্লাসের মেথডটা আর কাজ করবেনা; যেটা সাবক্লাসে লিখে দিয়েছো সেটাই কাজ করবে। মানে হল প্যারেন্ট ক্লাসের একটা মেথড সাবক্লাস দিয়ে ওভাররাইড হয়ে গেছে। আবার তুমি যদি মেইন ক্লাসের অবজেক্ট দিয়ে কল তাহলে আবার মেইন ক্লাসেরটাই কাজ করবে।  যেহেতু কোন মেথডটা কখন কল হয় তা রানটাইমে নির্ধারন হয় সেহেতু একে রানটাইম পলিমরফিজম বা ডায়নামিক পলিমফিজম বলা হয়।

 public class Animal {  
      public String name;  
      public int age;  
      public void Walk()  
      {     
           System.out.println("This message is from base class: ")
           System.out.println("Can Walk");  
      }  
      public void Call()  
      {  
           System.out.println(" Can call");  
      }       
 }  
 public class Human extends Animal {  
      public void Walk()  
      {  
           System.out.println("This message is from sub class:");  
           System.out.println("Human walks using two legs");  
      }  
 }  
 public class MainClass{  
      public static void main(String[] args) {  
           Human human1 = new Human();  
           human1.Walk();  //Walk() will be called on Human class. 
          
          Animal animal1 = new Animal();
          animal1.Walk();  //Walk will be called on Animal class 
      }  
 }  
 OUTPUT  
 This message is from sub class:  
 Human walks using two legs  

This message is from base class:
Can Walk


No comments:

Post a Comment