ওহে! আপনি ইতিমধ্যে জাভা পদ্ধতি ব্যবহার করেন এবং সেগুলি সম্পর্কে অনেক কিছু জানেন। পদ্ধতি ওভাররাইডিং কিভাবে কাজ করে - 1নিশ্চয়ই আপনি অনেক পদ্ধতি সহ একটি ক্লাস জুড়ে এসেছেন যার একই নাম কিন্তু ভিন্ন যুক্তি তালিকা রয়েছে। আপনি মনে রাখবেন যে এই ক্ষেত্রে আমরা মেথড ওভারলোডিং ব্যবহার করেছি। আজ আমরা একটি ভিন্ন পরিস্থিতির দিকে নজর দেব। কল্পনা করুন যে আমাদের একটি সাধারণ পদ্ধতি আছে, কিন্তু এটি কোন ক্লাসে ডাকা হয় তার উপর নির্ভর করে এটি বিভিন্ন জিনিস করা উচিত। আমরা কীভাবে এই আচরণটি বাস্তবায়ন করব? এটি বোঝার জন্য, আসুন Animalপ্যারেন্ট ক্লাস নেওয়া যাক, যা প্রাণীদের প্রতিনিধিত্ব করে এবং speakএতে একটি পদ্ধতি তৈরি করুন:

public class Animal {
  
   public void speak() {

       System.out.println("Hello!");
   }
}
যদিও আমরা সবেমাত্র আমাদের প্রোগ্রাম লিখতে শুরু করেছি, আপনি সম্ভবত একটি সম্ভাব্য সমস্যা দেখতে পাচ্ছেন: পৃথিবী প্রচুর প্রাণীতে পূর্ণ, এবং তারা সবাই ভিন্নভাবে "কথা বলে": বিড়াল মিউ, হাঁস কুয়াক, সাপ হিস ইত্যাদি। আমাদের লক্ষ্য সহজ: পদ্ধতি ওভাররাইডিং কিভাবে কাজ করে - 2আমরা কথা বলার জন্য একগুচ্ছ পদ্ধতি তৈরি করা এড়াতে চাই। meow()মেওয়িং, হিসিং ইত্যাদির জন্য পদ্ধতি তৈরি করার পরিবর্তে hiss(), আমরা চাই সাপ হিস করুক, বিড়াল মিউ করুক এবং কুকুরটি ঘেউ ঘেউ করুক যখন পদ্ধতিটি speak()বলা হয়। আমরা পদ্ধতি ওভাররাইডিং ব্যবহার করে সহজেই এটি অর্জন করতে পারি । উইকিপিডিয়া শব্দটিকে নিম্নরূপ ব্যাখ্যা করে: মেথড ওভাররাইডিং, অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং-এ, একটি ভাষা বৈশিষ্ট্য যা একটি সাবক্লাস বা চাইল্ড ক্লাসকে একটি পদ্ধতির একটি নির্দিষ্ট বাস্তবায়ন প্রদান করতে দেয় যা ইতিমধ্যেই এর সুপারক্লাস বা অভিভাবক শ্রেণীগুলির মধ্যে একটি দ্বারা সরবরাহ করা হয়েছে। যে মূলত সঠিক. ওভাররাইডিং আপনাকে একটি প্যারেন্ট ক্লাসের কিছু পদ্ধতি নিতে এবং প্রতিটি প্রাপ্ত ক্লাসে আপনার নিজস্ব বাস্তবায়ন লিখতে দেয়। শিশু শ্রেণিতে নতুন প্রয়োগটি পিতামাতার একটিকে "প্রতিস্থাপন করে"। আসুন একটি উদাহরণ সহ এটি দেখতে কেমন লাগে। আসুন আমাদের Animalক্লাসের 4 জন বংশধর তৈরি করি:

public class Bear extends Animal {
   @Override
   public void speak() {
       System.out.println("Growl!");
   }
}
public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void speak() {
       System.out.println("Woof!");
   }
}


public class Snake extends Animal {

   @Override
   public void speak() {
       System.out.println("Hiss!");
   }
}
এখানে ভবিষ্যতের জন্য একটি ছোট লাইফহ্যাক রয়েছে: একটি অভিভাবক শ্রেণীর পদ্ধতিগুলিকে ওভাররাইড করতে, IntelliJ IDE- তে প্রাপ্ত ক্লাসের কোডে যান , Ctrl+O টিপুন এবং মেনু থেকে ওভাররাইড পদ্ধতি... নির্বাচন করুন। শুরু থেকেই হটকি ব্যবহারে অভ্যস্ত হয়ে যান। তারা কোডিং গতি বাড়াবে! পছন্দসই আচরণ পেতে, আমরা কয়েকটি জিনিস করেছি:
  1. প্রতিটি ডিসেন্ডেন্ট ক্লাসে, আমরা প্যারেন্ট ক্লাসের মেথডের মতো একই নামের একটি পদ্ধতি তৈরি করেছি।
  2. আমরা কম্পাইলারকে বলেছিলাম যে আমরা শুধুমাত্র প্যারেন্ট ক্লাসের মতো পদ্ধতিটিকে একই নাম দিচ্ছি না বরং আমরা এর আচরণকে ওভাররাইড করতে চাই। কম্পাইলারের কাছে এই "বার্তা" @Override টীকাটির মাধ্যমে জানানো হয়।
    একটি পদ্ধতির উপরে @Override টীকাটি কম্পাইলারকে বলে (পাশাপাশি অন্যান্য প্রোগ্রামাররা আপনার কোড পড়ছেন), "চিন্তা করবেন না। এটি কোনও ভুল বা নজরদারি নয়। আমি সচেতন যে এই পদ্ধতিটি ইতিমধ্যেই বিদ্যমান, এবং আমি এটিকে ওভাররাইড করতে চাই .

  3. আমরা প্রতিটি বংশধর শ্রেণীর জন্য প্রয়োজনীয় বাস্তবায়ন লিখেছি। যখন speak()পদ্ধতিটি বলা হয়, একটি সাপ হিস হিস করে, একটি ভালুক গর্জন করা উচিত, ইত্যাদি।
চলুন দেখি এটি একটি প্রোগ্রামে কিভাবে কাজ করে:

public class Main {

   public static void main(String[] args) {

       Animal animal1 = new Dog();
       Animal animal2 = new Cat();
       Animal animal3 = new Bear();
       Animal animal4 = new Snake();
      
       animal1.speak();
       animal2.speak();
       animal3.speak();
       animal4.speak();
   }
}
কনসোল আউটপুট:

Woof! 
Meow! 
Growl! 
Hiss!
দুর্দান্ত, সবকিছু যেমন উচিত কাজ করে! আমরা 4টি রেফারেন্স ভেরিয়েবল তৈরি করেছি যার ধরন হল Animalপ্যারেন্ট ক্লাস, এবং তাদের ডিসেন্ড্যান্ট ক্লাসের 4টি ভিন্ন অবজেক্ট বরাদ্দ করেছি। ফলস্বরূপ, প্রতিটি বস্তু ভিন্নভাবে আচরণ করে। প্রাপ্ত প্রতিটি ক্লাসের জন্য, ওভাররাইড করা পদ্ধতিটি ক্লাসের speak()বিদ্যমান পদ্ধতিকে প্রতিস্থাপন করে (যা কেবল কনসোলে "স্পিকিং: " প্রদর্শন করে)। পদ্ধতি ওভাররাইডিংয়ের বিভিন্ন সীমাবদ্ধতা রয়েছে: speak()Animalপদ্ধতি ওভাররাইডিং কিভাবে কাজ করে - 3
  1. একটি ওভাররাইড করা পদ্ধতিতে প্যারেন্ট ক্লাসের পদ্ধতির মতো একই আর্গুমেন্ট থাকতে হবে।

    যদি speakপ্যারেন্ট ক্লাসের মেথড Stringইনপুট হিসেবে নেয়, তাহলে ডিসেন্ড্যান্ট ক্লাসে ওভাররাইড করা পদ্ধতিটিও Stringইনপুট হিসেবে নিতে হবে। অন্যথায়, কম্পাইলার একটি ত্রুটি তৈরি করবে:

    
    public class Animal {
    
       public void speak(String s) {
    
           System.out.println("Speaking: " + s);
       }
    }
    
    public class Cat extends Animal {
    
       @Override // Error!
       public void speak() {
           System.out.println("Meow!");
       }
    }
    

  2. ওভাররাইড করা পদ্ধতিতে অভিভাবক শ্রেণীর পদ্ধতির মতো একই রিটার্ন টাইপ থাকতে হবে।

    অন্যথায়, আমরা একটি সংকলন ত্রুটি পেতে হবে:

    
    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    
    public class Cat extends Animal {
    
       @Override
       public String speak() {         // Error!
           System.out.println("Meow!");
           return "Meow!";
       }
    }
    

  3. ওভাররাইড করা পদ্ধতির অ্যাক্সেস মডিফায়ারটিও আসলটির থেকে আলাদা হতে পারে না:

    
    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    public class Cat extends Animal {
    
       @Override
       private void speak() {      // Error!
           System.out.println("Meow!");
       }
    }
    
জাভাতে, পদ্ধতি ওভাররাইডিং হল পলিমরফিজম বাস্তবায়নের একটি উপায়। এর মানে হল যে এর প্রধান সুবিধা হল সেই নমনীয়তা যা আমরা আগে বলেছি। আমরা ক্লাসের একটি সহজ এবং যৌক্তিক শ্রেণীবিন্যাস তৈরি করতে পারি, প্রতিটি নির্দিষ্ট আচরণের সাথে (ঘেউ ঘেউ করা কুকুর, বিড়াল মায়া করা) কিন্তু একটি একক ইন্টারফেস — speak()বিভিন্ন পদ্ধতির গুচ্ছের পরিবর্তে প্রত্যেকের জন্য একটি একক পদ্ধতি, যেমন bark(), meow()ইত্যাদি ।