Java接口继承和扩展

6

假设你正在开发一款成熟的产品,并且需要一个新的搜索功能,这个功能是该产品50%所必需的。现在假设你已经与SomeDao建立了一个稳定的接口继承关系,而你不想打破这个关系...

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

有没有一种方法可以在所有其他类似于MoneyDao的地方暴露方法'findByCriteria(..)',以更清晰的方式避免重复?

请注意,如果可能的话,我想避免在使用它的地方强制转换为新类型并修改SomeDao。

问候, 詹姆斯

2个回答

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);     
}

现在实现了 MoneyDao 接口的类不需要改变,但是你可以使用 MoneyFinder 来传递 findByCriteria 方法。

好的,@Jonathon,你比我更快完成了这个 :-) 我别无选择,只能删除我的答案。 - Riduidel
1
@Riduidel 多个答案用不同的方式表达相同的事情并不一定是坏事 :) - Jonathon Faust
啊,我个人更喜欢避免投票分散和相互不一致的可能性。 - Riduidel
我想过这个,但是MoneyDao在很多地方都被使用,并且我不想将其转换为MoneyFinder或者向这些客户端注入新的查找接口。看来在当前的设计下,我在要求不可能的事情了。 - JARC

1

这完全取决于您是否需要一个可搜索且是 Dao 的类,换句话说,如果您的可搜索类必须也是 Dao,则需要使用通用方法使您的 Dao 可搜索。

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

现在你的类可以是一个简单的Dao或者是一个可搜索的Dao。可搜索的Dao也是一个简单的Dao。

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

谢谢,那个方法可以用 - 但是会破坏MoneyDao和SomeDao之间的当前关系,如果可能的话我想避免这种情况。 - JARC
我在考虑给SomeDao添加一个操作,名为getFilter(),它返回一个FilterDao,提供对findByCriteria(..)的访问 - 这意味着我需要在不需要的地方抛出一个不支持的异常..你有什么想法吗? - JARC
@JamesC 你是指它如何打破MoneyDao和SomeDao之间的当前关系?MoneyDao仍然是SomeDao。我认为,任何一种提供的解决方案都比将getFilter添加到SomeDao更加简洁。如果您不打算在当前使用MoneyDao的客户端或新功能中使用更受限制的接口,那么通过将findByCriteria从MoneyDao中分离出来,您想要实现什么目标呢? - Jonathon Faust
@JamesC 是的,你可以通过将搜索操作委托给外部对象来实现搜索功能。也许标准可以担起这个责任?我认为问题在于你试图将搜索通用化,但又不知道对象的类型。 - Lynch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接