কম্পিউটার

জাভাতে ডিফল্ট পদ্ধতি ব্যবহার করে হীরা সমস্যাটি কীভাবে সমাধান করবেন?


উত্তরাধিকার দুটি শ্রেণীর মধ্যে একটি সম্পর্ক যেখানে একটি শ্রেণী অন্য শ্রেণীর বৈশিষ্ট্যের উত্তরাধিকারী হয়। এই সম্পর্কটিকে −

হিসাবে extensions কীওয়ার্ড ব্যবহার করে সংজ্ঞায়িত করা যেতে পারে
public class A extends B{
}

যে শ্রেণীর বৈশিষ্ট্যগুলি উত্তরাধিকারসূত্রে পাওয়া যায় সেটিকে সাব ক্লাস বা চাইল্ড ক্লাস বলা হয় এবং যে শ্রেণীটির বৈশিষ্ট্যগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হয় সেটি হল সুপার ক্লাস বা, প্যারেন্ট ক্লাস।

উত্তরাধিকার সূত্রে সুপার ক্লাস সদস্যদের একটি অনুলিপি সাব ক্লাস অবজেক্টে তৈরি করা হয়। অতএব, সাব ক্লাস অবজেক্ট ব্যবহার করে আপনি উভয় শ্রেণীর সদস্যদের অ্যাক্সেস করতে পারবেন।

উত্তরাধিকারে একাধিক:

একক, মাল্টিলেভেল, হায়ারার্কিক্যাল, মাল্টিপল এবং হাইব্রিড নামে বিভিন্ন ধরনের উত্তরাধিকার পাওয়া যায়।

একাধিক উত্তরাধিকারে একটি শ্রেণী একাধিক শ্রেণীর বৈশিষ্ট্য উত্তরাধিকার সূত্রে পায়। অন্য কথায়, একাধিক উত্তরাধিকারে আমাদের একটি চাইল্ড ক্লাস এবং n নম্বর প্যারেন্ট ক্লাস থাকতে পারে। জাভা একাধিক উত্তরাধিকার সমর্থন করে না (ক্লাস সহ)।

হীরার সমস্যা

উদাহরণস্বরূপ, আমরা ধরে নিই যে জাভা একাধিক উত্তরাধিকার সমর্থন করে। সেই অনুমান সহ নিম্নলিখিত উদাহরণটি বিবেচনা করুন।

উদাহরণ

এখানে, আমাদের নমুনা নামে একটি বিমূর্ত শ্রেণী আছে −

হিসাবে একটি বিমূর্ত পদ্ধতি সহ
public class abstract Sample {
   public abstract demo();
}

তারপরে একই প্যাকেজ/ফোল্ডারে, আমাদের দুটি ক্লাস রয়েছে এই ক্লাসটি প্রসারিত করে এবং এর বিমূর্ত পদ্ধতি, ডেমো() বাস্তবায়নের চেষ্টা করছে।

public class Super1 extends Sample{
   public void demo() {
      System.out.println("demo method of super1");
   }  
}
public class Super2 extends Sample{
   public void demo() {
      System.out.println("demo method of super2");
   }  
}

আমাদের অনুমান অনুসারে, যেহেতু জাভা একাধিক উত্তরাধিকার সমর্থন করে, তাই আমরা সুপার1 এবং সুপার2 উভয় শ্রেণির উত্তরাধিকারী হওয়ার চেষ্টা করছি৷

public class SubClass extends Super1, Super2 {  
   public static void main(String args[]) {
      SubClass obj = new SubClass();
      obj.demo();
   }
}

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

জাভাতে ডিফল্ট পদ্ধতি ব্যবহার করে হীরা সমস্যাটি কীভাবে সমাধান করবেন?

এই কারণে জাভা একাধিক উত্তরাধিকারকে সমর্থন করে না অর্থাৎ, আপনি একটির বেশি অন্য ক্লাস প্রসারিত করতে পারবেন না। তবুও, যদি আপনি এটি করার চেষ্টা করেন, একটি কম্পাইল টাইম ত্রুটি তৈরি হয়।

কম্পাইল সময় ত্রুটি

কম্পাইল করার সময়, উপরের প্রোগ্রামটি নিম্নলিখিত ত্রুটি তৈরি করে -

MultipleInheritanceExample.java:9: error: '{' expected
public class MultipleInheritanceExample extends MyInterface1, MyInterface2{
                                                            ^
1 error

সমাধান

আপনি ডিফল্ট পদ্ধতি (Java8) এবং ইন্টারফেস ব্যবহার করে জাভাতে একাধিক উত্তরাধিকার অর্জন করতে পারেন।

Java8 থেকে ওয়ার্ডে ডিফল্ট পদ্ধতি একটি ইন্টারফেসে চালু করা হয়। অন্যান্য বিমূর্ত পদ্ধতির বিপরীতে এইগুলি একটি ডিফল্ট বাস্তবায়ন সহ একটি ইন্টারফেসের পদ্ধতি। যদি আপনার কোনো ইন্টারফেসে ডিফল্ট পদ্ধতি থাকে, তাহলে যে ক্লাসগুলি ইতিমধ্যে এই ইন্টারফেসটি বাস্তবায়ন করছে সেখানে এটিকে ওভাররাইড করা (বডি প্রদান) বাধ্যতামূলক নয়৷

আপনার দুটি ভিন্ন ইন্টারফেসে একই ডিফল্ট পদ্ধতি (একই নাম এবং স্বাক্ষর) থাকতে পারে এবং একটি ক্লাস থেকে আপনি এই দুটি ইন্টারফেস বাস্তবায়ন করতে পারেন।

যদি আপনি তা করেন, তাহলে আপনাকে অবশ্যই ক্লাস থেকে ডিফল্ট পদ্ধতিটি ওভাররাইড করতে হবে যাতে ডিফল্ট পদ্ধতিটি তার ইন্টারফেসের নামের সাথে স্পষ্টভাবে উল্লেখ করা হয়।

উদাহরণ

interface MyInterface1{  
   public static int num = 100;
   public default void display() {
      System.out.println("display method of MyInterface1");
   }
}
interface MyInterface2{  
   public static int num = 1000;
   public default void display() {
      System.out.println("display method of MyInterface2");
   }
}  
public class InterfaceExample implements MyInterface1, MyInterface2{
   public void display() {
      MyInterface1.super.display();
      //or,
      MyInterface2.super.display();
   }      
   public static void main(String args[]) {
      InterfaceExample obj = new InterfaceExample();
      obj.display();
   }
}

আউটপুট

display method of MyInterface1
display method of MyInterface2

  1. জাভাতে ডিফল্ট পদ্ধতি ব্যবহার করে ডায়মন্ড সমস্যা কীভাবে সমাধান করবেন

  2. কীভাবে জাভাতে ফাইল ইউটিলিটি পদ্ধতি ব্যবহার করে ডিরেক্টরি তৈরি করবেন?

  3. কিভাবে জাভা 9 এ JShell এর ডিফল্ট সম্পাদক পরিবর্তন করবেন?

  4. জাভাতে Gson লাইব্রেরি ব্যবহার করে জেনেরিক প্রকারগুলিকে কীভাবে সিরিয়ালাইজ এবং ডি-সিরিয়ালাইজ করবেন?