2011-05-10 94 views
6

想象一下,您正在开发一种成熟的产品,并且需要您的产品的50%需要的新搜索功能。现在,假设你已经与SomeDao建立接口继承关系,你不想要打破...Java界面继承和扩展

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

...是有办法,而不重复它暴露了该方法的findByCriteria(..)'在所有其他地方类似于MoneyDao它需要在一个更清洁的方式吗?

我想避免使用新的类型,并尽可能地修改SomeDao。

问候, 詹姆斯

回答

5

你能打破findByCriteria到自己的接口,它MoneyDao延长?事情是这样的:

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

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

现在你的类(ES)实施MoneyDao不需要改变,但你使用MoneyFinder可以绕过只是findByCriteria

+0

行,@Jonathon,你在这一个上比我快:-)除删除我的答案之外,我没有别的选择。 – Riduidel 2011-05-10 14:30:43

+1

@Riduidel多个答案以不同的方式说同一件事情不一定是坏的:) – 2011-05-10 14:41:27

+0

啊,我个人更喜欢避免投票分散和相互不连贯的可能性。 – Riduidel 2011-05-10 14:55:01

1

这一切都取决于你是否想要一个可搜索的类并且是一个Dao,换句话说,如果你的Searchable类必须是也是一个Dao。如果这种情况下,我会使用一种通用的方法来使您的道可搜索。

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

现在你的课堂可以是一个简单的Dao或SearchableDao。 SearchableDao也是一个简单的道。

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

谢谢,这将起作用 - 但打破了MoneyDao和SomeDao之间的当前关系,这是我想尽可能避免的。 – JamesC 2011-05-10 15:05:37

+0

我正在考虑向SomeDao添加一个名为getFilter()的操作,该操作返回一个FilterDao提供对findByCriteria(..)的访问 - 这意味着我需要抛出一个不受支持的异常,尽管它不需要..思想? – JamesC 2011-05-10 15:08:55

+0

@JamesC你的意思是说它打破了MoneyDao和SomeDao之间的当前关系? MoneyDao仍然是SomeDao。我认为提供的解决方案比向SomeDao添加getFilter更清洁。如果您不打算在目前使用MoneyDao或新功能的客户端中使用更有限的界面,那么您通过将MoneyBao中的findByCriteria分隔出来试图完成什么? – 2011-05-10 15:25:59