স্পষ্টভাবে জাভা মধ্যে একটি ডিফল্ট পদ্ধতি কল


247

জাভা 8 বিদ্যমান বাস্তবায়নগুলি সংশোধন করার প্রয়োজন ছাড়াই ইন্টারফেসগুলি বাড়ানোর ক্ষমতা প্রদান করার জন্য ডিফল্ট পদ্ধতিগুলি প্রবর্তন করে ।

আমি অবাক হই যে, যখন এই পদ্ধতিটি ওভাররাইড করা হয়েছে বা বিভিন্ন ইন্টারফেসে দ্বন্দ্বপূর্ণ ডিফল্ট বাস্তবায়নের কারণে উপলভ্য নয় তখন কোনও পদ্ধতির ডিফল্ট প্রয়োগটি স্পষ্টভাবে বলা সম্ভব কিনা।

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

class B implements A {
    @Override
    public void foo() {
        System.out.println("B.foo");
    }
    public void afoo() {
        // how to invoke A.foo() here?
    }
}

উপরের কোডটি বিবেচনা করে, আপনি কীভাবে A.foo()বি ক্লাসের একটি পদ্ধতি থেকে কল করবেন ?


আপনি আমাকে বলতে পারেন কেন আপনার ইন্টারফেস এ এর ​​ভিতরে আপনার foo () পদ্ধতি প্রয়োগ করা হচ্ছে ??
ম্যাকিয়েজ সাইগান

20
@ ম্যাসিজেজিগান এটি জাভা 8 এ অনুমোদিত
রোহিত জৈন

উত্তর:


330

অনুযায়ী এই নিবন্ধটি আপনি ইন্টারফেসে ডিফল্ট পদ্ধতি অ্যাক্সেস Aব্যবহার

A.super.foo();

এটি নিম্নলিখিত হিসাবে ব্যবহার করা যেতে পারে (ধরে নেওয়া ইন্টারফেস Aএবং Cউভয়ই ডিফল্ট পদ্ধতি রয়েছে foo())

public class ChildClass implements A, C {
    @Override    
    public void foo() {
       //you could completely override the default implementations
       doSomethingElse();
       //or manage conflicts between the same method foo() in both A and C
       A.super.foo();
    }
    public void bah() {
       A.super.foo(); //original foo() from A accessed
       C.super.foo(); //original foo() from C accessed
    }
}

Aএবং Cউভয়ই .foo()পদ্ধতি থাকতে পারে এবং নির্দিষ্ট ডিফল্ট বাস্তবায়ন বেছে নেওয়া যেতে পারে বা আপনি আপনার নতুন foo()পদ্ধতির অংশ হিসাবে একটি (বা উভয়) ব্যবহার করতে পারেন । আপনার প্রয়োগকারী শ্রেণীর অন্যান্য পদ্ধতির ডিফল্ট সংস্করণগুলিতে অ্যাক্সেস করতে আপনি একই বাক্য গঠন ব্যবহার করতে পারেন।

জে.এল.এস. এর 15 অধ্যায়ে পদ্ধতির আহবান সিনট্যাক্সের আনুষ্ঠানিক বিবরণ পাওয়া যাবে ।


14
আরও মনে রাখবেন যে যদি A extends SomeOtherInterfaceএবং SomeOtherInterfaceথাকে default Type method()তবে আপনি কেবল SomeOtherInterface.super.method()চাইল্ড ক্লাস থেকে কল করতে পারবেন না । আপনি কেবলমাত্র ChildClass' implementsক্লজ ' এ গণিত ইন্টারফেসের ডিফল্ট পদ্ধতিগুলিতে কল করতে পারেন , তাদের পিতামাত ইন্টারফেসগুলির পদ্ধতি নয়।
gvlasov

1
@ সুসিকা ভাল পয়েন্ট, যেমন নেই তেমনই super.super.someMethod();(কারণ এটি ভয়াবহ হবে)
রিচার্ড টিংল

@gvlasov ভাল পয়েন্ট, তবে কীভাবে শিশু ইন্টারফেস থেকে পিতামাতার ইন্টারফেসের ডিফল্ট পদ্ধতিতে অ্যাক্সেস করা যায়, এটি কি সম্ভব ?? আপডেট .......... হ্যাঁ সম্ভাব্য, আরো কংক্রিট এখানে ব্যাখ্যা stackoverflow.com/a/24280376/3791156
Raaghu

পুনঃটুইট
গৌরব

17

নীচের কোডটি কাজ করা উচিত।

public class B implements A {
    @Override
    public void foo() {
        System.out.println("B.foo");
    }

    void aFoo() {
        A.super.foo();
    }

    public static void main(String[] args) {
        B b = new B();
        b.foo();
        b.aFoo();
    }
}

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

আউটপুট:

B.foo
A.foo

আমি মনে করি এটি সর্বোত্তম উদাহরণ যা উপরের প্রশ্নের বর্ণনা দেয়। ধন্যবাদ
হেমন্ত পিলা

8

এই উত্তরটি মূলত সেই ব্যবহারকারীদের জন্য লেখা হয়েছে যারা বন্ধ হওয়া 45047550 প্রশ্ন থেকে আসছে ।

জাভা 8 ইন্টারফেস একাধিক উত্তরাধিকারের কিছু দিক পরিচয় করিয়ে দেয়। ডিফল্ট পদ্ধতিতে একটি বাস্তবায়িত ফাংশন বডি থাকে। সুপার ক্লাস থেকে কোনও পদ্ধতি কল করতে আপনি কীওয়ার্ডটি ব্যবহার করতে পারেন super, তবে আপনি যদি একটি সুপার ইন্টারফেস দিয়ে এটি তৈরি করতে চান তবে এটির নামটি স্পষ্টভাবে বলা দরকার।

class ParentClass {
    public void hello() {
        System.out.println("Hello ParentClass!");
    }
}

interface InterfaceFoo {
    default public void hello() {
        System.out.println("Hello InterfaceFoo!");
    }
}

interface InterfaceBar {
    default public void hello() {
        System.out.println("Hello InterfaceBar!");
    }
}

public class Example extends ParentClass implements InterfaceFoo, InterfaceBar {
    public void hello() {
        super.hello(); // (note: ParentClass.super is wrong!)
        InterfaceFoo.super.hello();
        InterfaceBar.super.hello();
    }

    public static void main(String[] args) {
        new Example().hello();
    }
}

আউটপুট:

হ্যালো প্যারেন্টক্লাস!
হ্যালো ইন্টারফেসফু!
হ্যালো ইন্টারফেসবার!


3

আপনাকে কোনও ইন্টারফেসের ডিফল্ট পদ্ধতি ওভাররাইড করার দরকার নেই। কেবল নীচের মত এটি কল করুন:

public class B implements A {

    @Override
    public void foo() {
        System.out.println("B.foo");
    }

    public void afoo() {
        A.super.foo();
    }

    public static void main(String[] args) {
       B b=new B();
       b.afoo();
    }
}

আউটপুট:

A.foo


9
ওপি বলেছেন: "যখন সেই পদ্ধতিটি ওভাররাইড করা হয়েছে তখন কোনও পদ্ধতির ডিফল্ট প্রয়োগের বিষয়টি স্পষ্টভাবে বলা সম্ভব"
ড্যাসব্লিংকনলাইট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.