【问题标题】:Java Interface Inheritance and ExtendingJava 接口继承和扩展
【发布时间】:2011-05-10 14:19:44
【问题描述】:

假设您正在开发一款成熟的产品,并且您的 50% 的产品都需要新的搜索功能。现在假设您已经与 SomeDao 建立了不想破坏的接口继承关系......

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

...有没有一种方法可以公开方法“findByCriteria(..)”,而不需要在所有其他类似于 MoneyDao 的地方以更简洁的方式重复它?

请记住,我想避免转换为使用它的新类型并尽可能修改 SomeDao。

问候, 詹姆斯

【问题讨论】:

    标签: java oop object-oriented-analysis


    【解决方案1】:

    您能否将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 多个答案以不同的方式说同样的事情并不一定是坏事:)
    • 啊,我个人更喜欢避免投票分散和相互不一致的可能性。
    • Yeh 想到了这一点,但我在很多地方都有 MoneyDao,如果我能提供帮助,我宁愿不使用 MoneyFinder 或向这些客户注入新的 finder 界面。我猜我是在要求当前设计的不可能。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢,这会起作用 - 但会破坏 MoneyDao 和 SomeDao 之间的当前关系,如果可能的话,我想避免这种情况。
    • 我正在考虑向 SomeDao 添加一个名为 getFilter() 的操作,该操作返回一个 FilterDao 提供对 findByCriteria(..) 的访问 - 这意味着我需要在不需要的地方抛出一个不受支持的异常..想法?
    • @JamesC 你是什么意思它破坏了 MoneyDao 和 SomeDao 之间的当前关系? MoneyDao 仍然是 SomeDao。我认为提供的任何一种解决方案都比将 getFilter 添加到 SomeDao 更干净。如果您不打算在当前使用 MoneyDao 的客户端或新功能中使用更有限的接口,您打算通过将 findByCriteria 与 MoneyDao 隔离来实现什么目的?
    • @JamesC 是的,您可以通过将搜索操作委托给外部对象来实现搜索功能。也许标准可以承担这个责任?我认为问题出在您试图概括搜索您不知道其类型的对象的事实。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2019-06-07
    • 2023-01-28
    相关资源
    最近更新 更多