Bisakah saya menganggap metode antarmuka sebagai metode abstrak?

15

Saya sedang memikirkan hal itu, dan saya memiliki beberapa keraguan.

Ketika saya mendeklarasikan antarmuka, misalnya:

public interface MyInterface
{
   public void method1();
   public void method2();
}

Bisakah metode antarmuka ini dianggap abstrak? Yang saya maksud adalah bahwa konsep metode abstrak adalah:

Metode abstrak adalah metode yang dideklarasikan, tetapi tidak mengandung implementasi.

Jadi, dapatkah metode ini dianggap abstrak? Mereka bukan metode abstrak "murni" karena saya tidak menggunakan abstractkata itu, tetapi secara konseptual, sepertinya mereka.

Apa yang bisa Anda ceritakan tentang hal itu?

Terima kasih.

rogcg
sumber
Mungkin yang terbaik di SO
billy.bob
5
@ billy.bob - Saya pikir itu terlalu abstrak untuk Stack Overflow. Tidak ada masalah pengkodean khusus di sini.
ChrisF
Apakah ini kode Java?
Andres F.
bukan itu. itu hanya sebuah contoh. pertanyaannya tidak terfokus pada bahasa pemrograman apa pun.
rogcg

Jawaban:

14

Antarmuka seperti kelas abstrak "murni". Kelas dan semua metodenya abstrak. Kelas abstrak dapat menerapkan metode tetapi kelas itu sendiri tidak dapat dipakai (berguna untuk warisan dan mengikuti KERING).

Untuk antarmuka, karena tidak ada implementasi sama sekali, mereka berguna untuk tujuan mereka: kontrak. Jika Anda mengimplementasikan Antarmuka maka Anda harus  menerapkan metode dalam antarmuka.

Jadi perbedaannya adalah kelas abstrak dapat menerapkan metode sedangkan antarmuka tidak bisa.

Alasan mereka terpisah adalah agar sebuah kelas dapat mengimplementasikan beberapa antarmuka. Java dan C # membatasi kelas untuk melekat dari kelas induk tunggal. Beberapa bahasa memungkinkan Anda mewarisi dari beberapa kelas dan Anda bisa menyelesaikan pekerjaan antarmuka melalui kelas abstrak "murni". Tetapi multiple inheritance memiliki masalah, yaitu Diamond Problem yang ditakuti

pembuat kode
sumber
+1 untuk menggabungkan perbedaan antara pewarisan kelas abstrak dan implementasi satu atau lebih antarmuka.
Masalah Berlian adalah paradoks yang mengagumkan.
rogcg
1
Saya tidak setuju dengan 'Antarmuka seperti bagian "kelas abstrak murni". Mereka adalah 2 jenis 'blok bangunan' OO yang berbeda, jadi mereka benar-benar tidak mirip sama sekali. Mereka berbagi beberapa fitur umum, tetapi pada dasarnya mereka adalah tipe yang berbeda, lebih seperti pria dan wanita misalnya :)
NoChance
5
@Emmand Kareem Saya tidak setuju dengan 'Antarmuka seperti bagian "murni" kelas abstrak'. Itu sebabnya saya menulisnya :-). Jika Anda memiliki alasan yang bagus untuk ketidaksetujuan Anda, silakan posting, id ingin mendengar
coder
Perlu dicatat bahwa c # 8 juga memperkenalkan konsep implementasi antarmuka default
John Wu
11

Saya menemukan jawaban yang bermanfaat di sini: http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

Semua metode dalam suatu antarmuka secara implisit abstrak, sehingga pengubah abstrak tidak digunakan dengan metode antarmuka (bisa jadi itu tidak perlu).

rogcg
sumber
1
Perhatikan juga bahwa kelas abstrak memperluas satu objek lainnya. Antarmuka tidak memiliki gagasan tentang superclass.
2
Perhatikan juga bahwa Anda dapat mengimplementasikan banyak antarmuka, tetapi Anda hanya dapat mewarisi dari satu kelas, abstrak atau tidak.
NullUserException
@ ThorbjørnRavnAndersen: Antarmuka dapat memperluas satu atau lebih antarmuka. Itu bukan hal yang sama dengan kelas super, tapi itu adalah tingkat warisan.
unholysampler
Anda dapat mengimplementasikan banyak antarmuka. Sepertinya konsep multiple inheritance, tetapi tidak persis.
rogcg
@ unholysampler, yang bukan superclass - seperti yang saya katakan.
4

Kelas abstrak dapat memiliki metode abstrak.

Antarmuka hanya dapat memiliki metode abstrak.

method1()dan method2()dalam contoh Anda adalah metode abstrak.

Tulains Córdova
sumber
-1

Perbedaannya di sini adalah bahwa kelas abstrak dapat berisi detail implementasi, meskipun tidak dapat dibuat sendiri. Sedangkan antarmuka hanyalah template untuk kelas

billy.bob
sumber
8
Metode abstrak tidak dapat berisi detail implementasi. Kelas abstrak bisa.
Matt H
Saya tahu perbedaan antara metode dan kelas - tapi saya tidak mengerti maksud Anda?
billy.bob
Jawaban Anda menyatakan bahwa metode abstrak dapat berisi detail implementasi - tidak bisa. Hanya salah ketik?
Matt H
1
Saya memperbaiki kesalahan ketik.
Martijn Verburg
1
@ billy.bob pertanyaan ini adalah tentang metode abstact.
SoylentGray
-2

Jadi dalam sebuah subkelas, metode abstrak yang diwarisi dapat kembali menjadi abstrak tanpa implementasi, sedangkan jika sebuah kelas mengimplementasikan antarmuka, metode itu harus diimplementasikan.

Devraj Giri
sumber
-3

Kelas antarmuka tidak memiliki metode abstrak. Mereka tidak memiliki metode sama sekali. Mereka hanya memiliki daftar metode yang harus diterapkan oleh kelas lain untuk dapat menyesuaikan dengan antarmuka. Dalam contoh Anda, tidak ada metode metode1 dan tidak ada metode metode2 sampai seseorang menambahkan metode ini ke kelas.

gnasher729
sumber