2011-05-10 25 views
6

Olgun bir ürün üzerinde çalıştığınızı ve ürününüzün% 50'si için yeni bir arama özelliğinin gerekli olduğunu düşünün. Şimdi de kırmak istemiyorum SomeDao olan kurulu anayüz ilişki ...Java Arayüz Kalıtım ve Genişletme

public interface MoneyDao 
    extends SomeDao<MoneyEntity> 
{ 
    //Operation common in much of the application 
    List<MoneyEntity> findByCriteria(MoneyCriteria criteria);  
} 

varsayarak ... onu tekrar etmeden 'findByCriteria (..)' yöntemini ortaya çıkarmak için bir yol yoktur MoneyDao gibi diğer yerlerde daha temiz bir şekilde gerekli olduğu yerlerde?

Çıplak akılda bulundurmak isterim ki, eğer mümkün olursa, onu kullanıp, değiştirerek, SomeDao'i yeni bir türe dökmekten kaçınmak istiyorum.

Selamlar, James

cevap

5

Eğer kendi arayüzüne findByCriteria kırmak ve MoneyDao bunu aşabilir mi? Böyle bir şey:

public interface MoneyDao 
    extends SomeDao<MoneyEntity>, MoneyFinder 
{ 
} 

public interface MoneyFinder 
{ 
    //Operation common in much of the application 
    List<MoneyEntity> findByCriteria(MoneyCriteria criteria);  
} 

Şimdi sınıf (lar) değiştirmek gerekmez MoneyDao uygulayan, ancak MoneyFinder kullanarak etrafında sadece findByCriteria geçebilir.

+0

Tamam, @Jonathon, benden daha hızlıydınız :-) Cevabımı silmekten başka seçeneğim yok. – Riduidel

+1

@Riduidel Aynı şeyleri farklı bir şekilde söyleyen çok sayıda cevap mutlaka kötü değildir :) –

+0

Ah, ben şahsen hem karşılıklı dağılım hem de oy verme dağılımından kaçınmayı tercih ederim. – Riduidel

1

Tümü, aranabilir ve bir Dao olan bir sınıf istiyorsanız, başka bir deyişle, Aranabilir sınıfınız 'un da bir Dao olması durumunda bağlıdır. Bu durumda, Dao Aranabilir yapmak için genel bir yaklaşım kullanırdım.

interface SearchableDao<Entity, Criteria> extends SomeDao<Entity> 
{ 
    List<Entity> findByCriteria(Criteria criteria); 
} 

Artık sınıfınız basit bir Dao veya SearchableDao olabilir. SearchableDao ayrıca basit bir Dao.

class MoneyDao implements SearchableDao<MoneyEntity, MoneyCriteria> 
{ 
    List<MoneyEntity> findByCriteria(MoneyCriteria criteria) {...} 
} 
+0

Teşekkürler, bu işe yarar - ama MoneyDao ve SomeDao arasındaki mevcut ilişkiyi kırar, mümkünse kaçınmak istediğim bir şey. – JamesC

+0

FindByCriteria'ya (..) erişim sağlayan bir FilterDao döndüren getFilter() adında SomeDao'e bir işlem eklemeyi düşünüyordum - bu, gerekli olmasa bile desteklenmeyen bir istisna atmam gerekeceği anlamına geliyordu. – JamesC

+0

@JamesC MoneyDao ve SomeDao arasındaki mevcut ilişkiyi nasıl kastediyorsunuz? MoneyDao hala bir SomeDao. Önerilen çözüm, SomeDao'e getFilter eklemekten daha temiz olduğunu düşünüyorum. Şu anda MoneyDao veya yeni işlevsellik kullanan istemcilerde daha sınırlı arabirim kullanmayı planlamıyorsanız, FindByCriteria'yı MoneyDao'den ayırarak ne yapmaya çalışıyorsunuz? –