আমি ডিফল্ট মেথড নিয়ে দুটি ইন্টারফেস তৈরি করছি যা নিম্নরূপঃ

public interface A {

    default public void print() {
        System.out.println("This is A");
    }

    default public A getInstance() {
        return this;
    }
}

দ্বিতীয়টি হচ্ছেঃ

public interface B {

    default public void print() {
        System.out.println("This is B");
    }

}

দুটি ইন্টারফেসকেই ইমপ্লিমেন্ট করে যে ক্লাসটিঃ

public class Cat implements A,B {

    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.getInstance().print();
    }

    @Override
    public void print() {
        System.out.println("Overriden");
        B.super.print();
        A.super.print();
    }

}

আউটপুট হচ্ছেঃ

Overriden
This is B
This is A

আমার প্রশ্ন হচ্ছে ১ম ইন্টারফেসের প্রিন্ট মেথড বাদ দিয়ে ওভাররাইড করা প্রিন্ট মেথড কেন কল করা হলো এবং getInstance() মেথড কি রিটার্ন করছে?

asked 23 Oct '17, 16:31

amitsen01ei's gravatar image

amitsen01ei
112

edited 24 Oct '17, 07:40

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
16618


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

এজন্য নতুন এই ডিফল্ট (default) কিওয়ার্ড যুক্ত করে একটি বডি যুক্ত করা হয় যা যে ক্লাসগুলো ইমপ্লিমেন্ট করে সেগুলো সরাসরি ইনহেরিট করে। যেমন- সবগুলো Iterable ইন্টারফেসে forEach যুক্ত করা হয়েছে। এটি একটি ডিফল্ট মেথড। তাই এই ইন্টারফেসটিকে যে সব ক্লাস ইমপ্লিমেন্ট করে তাদেরকে মেথডটি ইমপ্লিমেন্ট করার প্রয়োজন নেই।

কিন্তু কনফ্লিক্ট হওয়ার সম্ভবনা থেকেই যায়। তবে এক্ষেত্র শর্ত হচ্ছে-

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

অর্থাৎ ক্লাস ও ইন্টারফেসের মধ্যে কনফ্লিক্ট থাকলে, ক্লাসের ইমপ্লিমেন্টেশন সব সময় প্রাধান্য পাবে। যদি এমন হয় যে, একাধিক ইন্টারফেসের মধ্যে একই ডিফল্ট মেথড সিগনেচার থাকে, তাহলে যে ক্লাসটি সেই ইন্টারফেসটিকে ইমপ্লিমেন্ট করে, তাকে সেই মেথডটিকে ওভাররাইড করতে হবে, নতুবা ক্লাসটি কম্পাইল হবে না। সুতরাং দেখা যাচ্ছে এ দিক থেকে এটি নিরাপদ।

permanent link

answered 24 Oct '17, 04:50

bazlur_rahman's gravatar image

bazlur_rahman
1.2k17

edited 24 Oct '17, 07:39

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
16618

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×204
×2

question asked: 23 Oct '17, 16:31

question was seen: 196 times

last updated: 24 Oct '17, 07:40