যদি কোনও প্রকার দুটি ইন্টারফেস প্রয়োগ করে এবং প্রত্যেকটি interfaceএমন একটি পদ্ধতি নির্ধারণ করে যা স্বতন্ত্র স্বাক্ষরযুক্ত থাকে, তবে কার্যত কেবলমাত্র একটি পদ্ধতি রয়েছে এবং সেগুলি পার্থক্যযোগ্য নয়। যদি, বলুন, দুটি পদ্ধতির দ্বন্দ্বপূর্ণ রিটার্নের ধরন রয়েছে তবে এটি সংকলন ত্রুটি হবে। এটি উত্তরাধিকার, পদ্ধতি ওভাররাইডিং, গোপনীয়তা এবং ঘোষণার সাধারণ নিয়ম এবং এটি 2 উত্তরাধিকার সূত্রে প্রাপ্ত interfaceপদ্ধতিগুলির মধ্যেই নয় , এমনকি একটি interfaceএবং একটি দুর্দান্ত classপদ্ধতি বা জেনেরিকের ধরণের ক্ষয়ের কারণে কেবল দ্বন্দ্বের ক্ষেত্রেও সম্ভব হয়।
সামঞ্জস্যতা উদাহরণ
এখানে একটি উদাহরণ রয়েছে যেখানে আপনার interface Giftএকটি present()পদ্ধতি রয়েছে, যার একটি পদ্ধতি রয়েছে (যেমন উপহার উপস্থাপন করে), এবং একটিও interface Guestরয়েছে যার একটি present()পদ্ধতিও রয়েছে (যেমন, অতিথি উপস্থিত আছেন এবং অনুপস্থিত নেই)।
Presentable johnnyউভয় একটি Giftএবং একটি Guest।
public class InterfaceTest {
interface Gift { void present(); }
interface Guest { void present(); }
interface Presentable extends Gift, Guest { }
public static void main(String[] args) {
Presentable johnny = new Presentable() {
@Override public void present() {
System.out.println("Heeeereee's Johnny!!!");
}
};
johnny.present(); // "Heeeereee's Johnny!!!"
((Gift) johnny).present(); // "Heeeereee's Johnny!!!"
((Guest) johnny).present(); // "Heeeereee's Johnny!!!"
Gift johnnyAsGift = (Gift) johnny;
johnnyAsGift.present(); // "Heeeereee's Johnny!!!"
Guest johnnyAsGuest = (Guest) johnny;
johnnyAsGuest.present(); // "Heeeereee's Johnny!!!"
}
}
উপরের স্নিপেট সংকলন এবং রান।
নোট করুন যে শুধুমাত্র একটি @Override প্রয়োজনীয় আছে !!! । এটি কারণ Gift.present()এবং Guest.present()" @Override-প্রসূত" ( জেএলএস 8.4.2 )।
সুতরাং, johnny কেবলমাত্র একটির বাস্তবায়ন রয়েছে present()এবং আপনি কীভাবে আচরণ করবেন johnnyতা বিবেচনাধীন নয় , একটি Giftহিসাবে বা হিসাবে হিসাবে Guest, অনুরোধ করার জন্য কেবল একটি পদ্ধতি রয়েছে।
অসামঞ্জস্যতার উদাহরণ
দুটি উত্তরাধিকারসূত্রে প্রাপ্ত পদ্ধতিটি @Overrideঅপরিহার্য নয় এমন একটি উদাহরণ এখানে :
public class InterfaceTest {
interface Gift { void present(); }
interface Guest { boolean present(); }
interface Presentable extends Gift, Guest { } // DOES NOT COMPILE!!!
// "types InterfaceTest.Guest and InterfaceTest.Gift are incompatible;
// both define present(), but with unrelated return types"
}
এটি আরও পুনর্ব্যক্ত করেছে যে উত্তরাধিকার সূত্রে সদস্যদের interfaceসদস্য ঘোষণার সাধারণ নিয়ম মেনে চলতে হবে। এখানে আমাদের রয়েছে Giftএবং বেমানান রিটার্নের প্রকারগুলি Guestসংজ্ঞায়িত করা হয়েছে present(): একে voidঅপরকে boolean। একই কারণে তুমি পারবে না যে একটি void present()এবং একটি boolean present()এক ধরনের, একটি সংকলন ভুলবশত এই উদাহরণে ফলাফল নেই।
সারসংক্ষেপ
আপনি যে পদ্ধতিগুলি @Overrideযথাযথ, উত্তরাধিকারসূত্রে প্রাপ্ত এবং লুকিয়ে থাকা পদ্ধতির স্বাভাবিক প্রয়োজনীয়তার সাপেক্ষে উত্তরাধিকারী হতে পারেন । যেহেতু তারা হয় @Override -equivalent, কার্যকরীভাবে সেখানে বাস্তবায়ন শুধুমাত্র একটি পদ্ধতি, এবং এইভাবে সেখানে পার্থক্য / থেকে নির্বাচন করার কিছুই নেই।
@Overrideসংকলকটি কোন ইন্টারফেসের জন্য কোন পদ্ধতিটি তা সনাক্ত করতে হবে না, কারণ তারা একবার- সুক্ষ্ম হওয়ার জন্য দৃ are় সংকল্পবদ্ধ হয়ে গেলে তারা একই পদ্ধতি।
সম্ভাব্য অসুবিধাগুলি সমাধান করা খুব কঠিন কাজ হতে পারে তবে এটি সম্পূর্ণরূপে অন্য একটি সমস্যা।
তথ্যসূত্র