Mengapa sebuah antarmuka tidak dapat mengimplementasikan antarmuka lain?


104

Yang saya maksud:

interface B {...}

interface A extends B {...} // allowed  

interface A implements B {...} // not allowed

Saya mencarinya di Google dan menemukan ini :

implementsmenunjukkan definisi implementasi untuk metode antarmuka. Namun antarmuka tidak memiliki implementasi jadi itu tidak mungkin.

Namun, antarmuka adalah kelas abstrak 100%, dan kelas abstrak dapat mengimplementasikan antarmuka (100% kelas abstrak) tanpa mengimplementasikan metodenya. Apa masalah saat ini didefinisikan sebagai "antarmuka"?

Secara detail,

interface A {
    void methodA();
}

abstract class B implements A {} // we may not implement methodA() but allowed

class C extends B {
   void methodA(){}
} 

interface B implements A {} // not allowed. 
//however, interface B = %100 abstract class B

Jawaban:


110

implementsberarti implementasi, bila interfacedimaksudkan untuk menyatakan hanya menyediakan interfacebukan untuk implementasi.

A 100% abstract classsecara fungsional setara dengan an interfacetetapi juga dapat memiliki implementasi jika Anda mau (dalam hal ini tidak akan tetap 100% abstract), jadi dari perspektif JVM mereka adalah hal yang berbeda.

Variabel anggota dalam kelas abstrak 100% juga dapat memiliki kualifikasi akses apa pun, di mana dalam antarmuka mereka secara implisit public static final.


8
Pada Java 8, Antarmuka dapat memiliki metode default, membuatnya jauh lebih mirip dengan Kelas Abstrak dalam hal itu.
forresthopkinsa

4
Terima kasih untuk kalimat terakhirnya!
Tao Zhang

24

implementsberarti sebuah perilaku akan didefinisikan untuk abstractmetode (kecuali untuk kelas abstrak jelas), Anda mendefinisikan implementasinya.

extends berarti bahwa perilaku diwarisi.

Dengan antarmuka adalah mungkin untuk mengatakan bahwa satu antarmuka harus memiliki perilaku yang sama dengan yang lain, bahkan tidak ada implementasi yang sebenarnya. Itulah mengapa lebih masuk akal untuk antarmuka ke extendsantarmuka lain daripada menerapkannya.


Di samping catatan, ingatlah bahwa meskipun sebuah abstractkelas dapat mendefinisikan abstractmetode (dengan cara yang wajar sebuah antarmuka melakukannya), itu masih sebuah kelas dan masih harus diwariskan (diperpanjang) dan tidak diimplementasikan.


4

Secara konseptual ada dua kelas dan antarmuka "domain". Di dalam domain ini Anda selalu memperluas, hanya kelas yang menerapkan antarmuka, yang semacam "melintasi batas". Jadi pada dasarnya "meluas" untuk antarmuka mencerminkan perilaku kelas. Setidaknya menurut saya inilah logika di baliknya. Tampaknya tidak semua orang setuju dengan logika semacam ini (saya merasa sedikit dibuat-buat), dan sebenarnya tidak ada alasan teknis untuk memiliki dua kata kunci yang berbeda sama sekali.


Jika "Y memanjang X" dan tidak disegel, maka itu mungkin untuk memiliki jenis lain "Z" yang memanjang "Y". Itu akan benar apakah X adalah antarmuka atau kelas. Jika "W mengimplementasikan X", bagaimanapun, maka tidak mungkin untuk memiliki "V mengimplementasikan W". Fakta bahwa "extends" dapat "dirantai" dan "diimplementasikan" sepertinya bukan alasan yang baik untuk memiliki kata kunci yang berbeda.
supercat

2

Namun, antarmuka adalah 100% kelas abstrak dan kelas abstrak dapat mengimplementasikan antarmuka (100% kelas abstrak) tanpa mengimplementasikan metodenya. Apa masalah saat ini didefinisikan sebagai "antarmuka"?

Ini hanyalah masalah kesepakatan. Penulis bahasa java memutuskan bahwa "meluas" adalah cara terbaik untuk menggambarkan hubungan ini, jadi itulah yang kita semua gunakan.

Secara umum, meskipun sebuah antarmuka adalah "kelas abstrak 100%," kami tidak menganggapnya seperti itu. Kami biasanya berpikir tentang antarmuka sebagai janji untuk mengimplementasikan metode kunci tertentu daripada kelas asal. Jadi kami cenderung menggunakan bahasa yang berbeda untuk antarmuka daripada untuk kelas.

Seperti yang dinyatakan orang lain, ada alasan bagus untuk memilih "perluasan" daripada "penerapan".


Ya pak. Ini masalah kesepakatan. Banyak orang mencoba untuk membenarkan secara logis batasan bahasa Java asli Sun, padahal itu hanya sudut pandang pribadi. Jika kompiler telah menambahkan antarmuka "implement", saya rasa orang yang sama akan membenarkannya juga. :-)
Little Santi

1

Semoga ini bisa sedikit membantu Anda apa yang telah saya pelajari di ups (inti java) selama saya kuliah.

Implements menunjukkan definisi implementasi untuk metode antarmuka. Namun antarmuka tidak memiliki implementasi jadi itu tidak mungkin. Namun sebuah antarmuka dapat memperluas antarmuka lain, yang berarti ia dapat menambahkan lebih banyak metode dan mewarisi tipenya.

Berikut contoh di bawah ini, inilah pemahaman saya dan apa yang telah saya pelajari di ups.

interface ParentInterface{  
        void myMethod();  
}  

interface SubInterface extends ParentInterface{  
        void anotherMethod();  
}  

dan ingat satu hal satu antarmuka hanya dapat memperluas antarmuka lain dan jika Anda ingin mendefinisikan fungsinya pada beberapa kelas maka hanya antarmuka yang diimplementasikan misalnya di bawah ini

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}

Sekarang, jika sebuah kelas mengimplementasikan antarmuka ini, akan terlihat seperti ini:

public class SomeClass implements Dog
{
    public boolean Barks{
    // method definition here

    }

    public boolean isGoldenRetriever{
    // method definition here
    }
}

dan jika kelas abstrak memiliki beberapa fungsi abstrak, definisikan dan deklarasikan, dan Anda ingin mendefinisikan fungsi tersebut atau Anda dapat mengatakan mengimplementasikan fungsi tersebut maka Anda harus memperluas kelas itu karena kelas abstrak hanya dapat diperpanjang. berikut adalah contoh di bawah ini.

public abstract class MyAbstractClass {

    public abstract void abstractMethod();
}

Berikut adalah contoh subclass dari MyAbstractClass:

public class MySubClass extends MyAbstractClass {

    public void abstractMethod() {
        System.out.println("My method implementation");
    }
}

0

Antarmuka seperti abstraksi yang tidak menyediakan fungsionalitas apa pun. Oleh karena itu, Ia tidak 'mengimplementasikan' tetapi memperluas abstraksi atau antarmuka lain.


-6

Antarmuka adalah kelas yang berisi metode abstrak yang tidak dapat membuat objek. Karena Antarmuka tidak dapat membuat objek dan ini bukan kelas murni, tidak ada gunanya mengimplementasikannya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.