Bir arabirimi doğrudan uygulamalı mıyım yoksa üst sınıf mı yapmalıyım?


14

Arasında bir fark var mı

public class A extends AbstractB implements C
{...}

e karşı...

public class A extends AbstractB
{...}
abstract class AbstractB implements C
{...}

Her iki durumda da A sınıfının arayüze uygun olacağını anlıyorum. İkinci durumda, AbstractBiçinde arayüz yöntemleri için uygulama sağlayabilir C. Tek fark bu mu?

Arabirim yöntemlerinden herhangi biri için bir uygulama sağlamak İSTEMİYORUM AbstractB , hangi stili kullanmalıyım ? Birini veya diğerini kullanmanın gizli bir 'dokümantasyon' amacı var mı?


3
başlık üzerine öneri: doğrudan bir arayüz uygulamak veya süper sınıf bunu yapmak gerekir
Jeanne Boyarsky

Yanıtlar:


20

Her şey AbstractB implements Canlamsal olarak bağlıdır . Yani AbstractB, uygulamak için anlamsal olarak mantıklıysa C, o zaman devam edin.

Somut örnekler alırsak semantik fark netleşir.

A = Köpek, AbstractB = Hayvan, C = IBark ise

Mantıklı olan tek seçenek

class Dog extends Animal implements IBark{

Bu hiçbir anlam ifade etmez, çünkü bu tüm hayvanların havladığını ima eder.

class Animal implements IBark{

Eğer class Amiras almaktan daha fazlasına sahipseniz, diğer farklılıklar devreye girer AbstractB. # 1'de C'yi uygulamak zorunda değiller, # 2'de hepsi C'yi uygulamak zorunda kalırlar.


1
+1 Cevabımdan çok daha net!
Hand-E-Food

Ayrıca, arayüz olsaydı uygulamak Heterotrophyapmak makul görünüyor . Başka birçok havlayan hayvanı bekliyorsanız ve onlara aynı şekilde davranmak istiyorsanız, başka bir sınıf gitmek için bir yol olacaktır. AnimalHeterotrophBarkingAnimal extends Animal implements IBark
scarfridge

@scarfridge Aslında hayvanın uzamasını beklerdim Heterotrophama girdiniz için teşekkürler
Karthik T

2

Uygun miras ilişkisini belirlemenin kolay yolu, sınıfların kendilerine değil, bu sınıflardaki yöntemleri çağıran koda bakmaktır . Kodunuzda bir yerde AbstractB b = new A();veya gibi bir şey var otherObject.addAbstractB(this);. Her iki durumda da, daha sonra AbstractBçeşitli yöntem çağrıları yapmak için bu başvuruyu kullanırsınız.

Bu durumda, yöntemlerini çağırmak isteyeceksiniz C? Eğer öyleyse, o zaman AbstractBuygulamalıdır C. Değilse, olmamalıdır. Böyle bir durumunuz yoksa, mirasa ihtiyacınız yoktur ve kompozisyonu kullanmak için yeniden düşünmek gerekir, çünkü daha gevşek bağlanır.


2

"Gizli" bir dokümantasyon amacı değildir. AbstractB'yi ve tüm alt sınıflarını C'ye atmanıza izin verir. Aslında üç stil vardır.

public class A extends AbstractB implements C
public class AbstractB

Eğer AbstractB mantıksal olarak C uygulamasaydı bunu kullanardım. Yöntemleri sağlamasa bile, bir anlamı olabilir. Köpek uzatır gibi Wag uygular Hayvan. Bütün hayvanların Wag için bir anlamı yok. Bu yaklaşımın aslında AbstractB'nin uygulamayı sağlamasını engellemediğini unutmayın.

public class A extends AbstractB
public AbstractB implements C

Tüm alt sınıfların arabirimi uygulamasını isteseydim bunu kullanardım VE hepsinin bunu yapması mantıklı. Beagle gibi AbstractDog Wag uygular uzatır.

public class A extends AbstractB implements C
public class AbstractB implements C

Bu gereksizdir ancak netlik katabilir.


Bence 2. paragraftaki "AbstractC" (soruda mevcut değil) "AbstractB" olarak değiştirilmelidir. Editörlerin en az 6 karakter olması gerektiği için bunu düzenleyemiyorum.
cellepo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.