Apakah ada perbedaan di antara keduanya
public class A extends AbstractB implements C
{...}
melawan...
public class A extends AbstractB
{...}
abstract class AbstractB implements C
{...}
Saya mengerti bahwa dalam kedua kasus, kelas A akan berakhir sesuai dengan antarmuka. Dalam kasus kedua, AbstractB
dapat menyediakan implementasi untuk metode antarmuka di C
. Apakah itu satu-satunya perbedaan?
Jika saya TIDAK ingin memberikan implementasi untuk metode antarmuka apa pun AbstractB
, gaya apa yang harus saya gunakan ? Apakah menggunakan satu atau yang lain memiliki beberapa tujuan 'dokumentasi' tersembunyi?
java
interfaces
abstract-class
c_maker
sumber
sumber
Jawaban:
Itu semua tergantung pada apakah secara
AbstractB implements C
semantik. Yaitu jika masuk akal untukAbstractB
menerapkanC
, kemudian pergi untuk itu.Jika kita mengambil contoh nyata perbedaan semantik menjadi jelas.
Jika A = Anjing, AbstractB = Hewan, C = IBark
Hanya pilihan yang masuk akal
Ini tidak masuk akal, karena ini akan menyiratkan bahwa semua binatang menggonggong.
Perbedaan lainnya ikut berperan jika Anda memiliki lebih dari sekadar
class A
mewarisiAbstractB
. Di # 1 mereka tidak perlu mengimplementasikan C, di # 2 mereka semua dipaksa untuk mengimplementasikan C.sumber
Heterotroph
itu tampaknya masuk akal untukAnimal
menerapkanHeterotroph
. Jika Anda mengharapkan banyak binatang menggonggong lainnya dan ingin memperlakukan mereka dengan cara yang sama kelas lainBarkingAnimal extends Animal implements IBark
akan menjadi cara untuk pergi.Heterotroph
tetapi terima kasih atas masukan AndaCara mudah untuk menentukan hubungan pewarisan yang tepat bukanlah dengan melihat kelas itu sendiri, tetapi pada kode yang memanggil metode pada kelas tersebut. Di suatu tempat dalam kode Anda, Anda memiliki sesuatu seperti
AbstractB b = new A();
atauotherObject.addAbstractB(this);
. Either way, Anda kemudian menggunakanAbstractB
referensi itu untuk membuat berbagai panggilan metode.Dalam situasi itu, apakah Anda ingin memanggil metode
C
? Jika demikian, makaAbstractB
harus diimplementasikanC
. Jika tidak, seharusnya tidak. Jika Anda tidak memiliki situasi seperti itu, maka Anda tidak perlu warisan, dan harus refactor untuk menggunakan komposisi sebagai gantinya karena itu jauh lebih longgar ditambah.sumber
Ini bukan tujuan dokumentasi "tersembunyi". Ini memungkinkan Anda untuk memberikan AbstractB dan semua subkelasnya ke C. Sebenarnya ada tiga gaya.
Saya akan menggunakan ini jika AbstractB tidak secara logis mengimplementasikan C. Bahkan jika itu tidak memberikan metode, itu bisa memiliki makna. Seperti Anjing memperluas Wag alat Hewan. Tidak masuk akal bagi semua hewan untuk Bercinta. Perhatikan bahwa pendekatan ini sebenarnya tidak menghalangi AbstractB dari menyediakan implementasi.
Saya akan menggunakan ini jika saya ingin semua subclass mengimplementasikan antarmuka DAN masuk akal bagi mereka semua untuk melakukannya. Seperti Beagle memperluas AbstractDog mengimplementasikan Wag.
Yang ini berlebihan tetapi bisa menambah kejelasan.
sumber