java - method - জাভা পলিমরফিজম




একই পদ্ধতি সঙ্গে একটি ক্লাসে দুটি ইন্টারফেস বাস্তবায়ন। কোন ইন্টারফেস পদ্ধতি overridden হয়? (5)

একই পদ্ধতি নাম এবং স্বাক্ষর সঙ্গে দুটি ইন্টারফেস। কিন্তু একক শ্রেণির দ্বারা প্রয়োগ করা হলে কম্পাইলারটি কোন ইন্টারফেসের জন্য কোন পদ্ধতিটি সনাক্ত করবে?

উদা:

interface A{
  int f();
}

interface B{
  int f();
}

class Test implements A, B{   
  public static void main(String... args) throws Exception{   

  }

  @Override
  public int f() {  // from which interface A or B
    return 0;
  }
}   

ইন্টারফেস হিসাবে, আমরা কেবলমাত্র পদ্ধতিগুলি, কংক্রিট ক্লাস ঘোষণা করছি যা এই উভয় ইন্টারফেসগুলি বুঝতে পারে যে কেবলমাত্র একটি পদ্ধতি রয়েছে (যেমন আপনি উভয়ের উভয়েরই ফেরত ধরনতে একই নামের বর্ণনা করেছেন)। সুতরাং এর সাথে কোন সমস্যা নেই। আপনি কংক্রিট ক্লাসে সেই পদ্ধতিটি নির্ধারণ করতে পারবেন।

কিন্তু যখন দুটি ইন্টারফেস একই নামের সাথে একটি পদ্ধতি থাকে কিন্তু ভিন্ন রিটার্ন টাইপ থাকে এবং আপনি কংক্রিট ক্লাসে দুটি পদ্ধতি প্রয়োগ করেন:

নীচের কোড তাকান দয়া করে:

public interface InterfaceA {
  public void print();
}


public interface InterfaceB {
  public int print();
}

public class ClassAB implements InterfaceA, InterfaceB {
  public void print()
  {
    System.out.println("Inside InterfaceA");
  }
  public int print()
  {
    System.out.println("Inside InterfaceB");
    return 5;
  }
}

যখন কম্পাইলার পদ্ধতি "পাবলিক অকার্যকর মুদ্রণ ()" পায় তখন এটি প্রথমে ইন্টারফেসএ দেখায় এবং এটি এটি পায়। তবে এখনও এটি কম্পাইল সময় ত্রুটি দেয় যা রিটার্ন টাইপ ইন্টারফেস বি পদ্ধতির সাথে সামঞ্জস্যপূর্ণ নয়।

সুতরাং এটা কম্পাইলার জন্য haywire যায়।

এইভাবে, আপনি একই নামের পদ্ধতির সাথে দুটি ইন্টারফেস বাস্তবায়ন করতে সক্ষম হবেন না তবে বিভিন্ন রিটার্ন টাইপ।


এই প্রশ্নটির সদৃশ হিসাবে চিহ্নিত করা হয়েছে https://.com/questions/24401064/understanding-and-solving-the-diamond-problems-in-java

একাধিক উত্তরাধিকার সমস্যা পেতে আপনার জাভা 8 প্রয়োজন, তবে এটি এখনও হীরের সমস্যা নয়।

interface A {
    default void hi() { System.out.println("A"); }
}

interface B {
    default void hi() { System.out.println("B"); }
}

class AB implements A, B { // won't compile
}

new AB().hi(); // won't compile.

জেবি নিজেট মন্তব্য হিসাবে আপনি এই আমার overriding ঠিক করতে পারেন।

class AB implements A, B {
    public void hi() { A.super.hi(); }
}

তবে, আপনার কোন সমস্যা নেই

interface D extends A { }

interface E extends A { }

interface F extends A {
    default void hi() { System.out.println("F"); }
}

class DE implement D, E { }

new DE().hi(); // prints A

class DEF implement D, E, F { }

new DEF().hi(); // prints F as it is closer in the heirarchy than A.

বেনামী হিসাবে ইন্টারফেস বাস্তবায়ন করার চেষ্টা করুন।

public class MyClass extends MySuperClass implements MyInterface{

MyInterface myInterface = new MyInterface(){

/* Overrided method from interface */
@override
public void method1(){

}

};

/* Overrided method from superclass*/
@override
public void method1(){

}

}

যতদূর কম্পাইলার উদ্বিগ্ন, সে দুটি পদ্ধতি একই। উভয় একটি বাস্তবায়ন হবে।

দুটি পদ্ধতি কার্যকরভাবে অভিন্ন হলে এটি একটি সমস্যা নয়, এতে তাদের একই প্রয়োগ করা উচিত। যদি তারা চুক্তিগতভাবে ভিন্ন (প্রতিটি ইন্টারফেসের জন্য ডকুমেন্টেশন অনুসারে), আপনি সমস্যায় পড়বেন।


সনাক্ত করার কিছুই নেই। ইন্টারফেস শুধুমাত্র একটি পদ্ধতির নাম এবং স্বাক্ষর নিষিদ্ধ। উভয় ইন্টারফেসের ঠিক একই নাম এবং স্বাক্ষর করার পদ্ধতি থাকে তবে বাস্তবায়ন ক্লাসটি একক কংক্রিট পদ্ধতির সাথে ইন্টারফেস পদ্ধতিগুলি বাস্তবায়ন করতে পারে।

যাইহোক, যদি দুটি ইন্টারফেস পদ্ধতির সেমিটিক চুক্তিগুলি বিপরীত হয় তবে আপনি বেশ হারিয়েছেন; আপনি তারপর একটি একক বর্গ উভয় ইন্টারফেস বাস্তবায়ন করতে পারবেন না।





override