【问题标题】:extract common methods from interfaces从接口中提取常用方法
【发布时间】:2017-01-15 17:02:06
【问题描述】:

我有以下问题。有一个名为 UserExpactations 的接口,在 builder-style 中有一堆方法来验证一些逻辑。

看起来像这样:

interface UserExpectations {
    UserExpectations expectSuccessResponseFromApi;
    UserExpectations expectFailResponseFromApi;


    UserExpectations expectUserInDB;
    // more user-specific methods
}

每个方法都可以返回UserExpactations,因此我们可以将它们链接在一起。

现在我需要再添加一个expectator类,并且有一些共同的逻辑,即前两个方法。

所以它看起来像这样:

interface OrderExpectations {

    // these are common to UserExpectations
    OrderExpectations expectSuccessResponseFromApi;
    OrderExpectations expectFailResponseFromApi;


    OrderExpectations expectOrderInCart;
    OrderExpectations expectOrderInDB;
    // some more order specific methods
}

我想将这些常用方法提取到抽象类或另一个顶级接口。这些方法应该在一个地方实施。每个expectators 都应该知道他们的实现。但问题是每个常用方法都应该返回一个特定的*Expactations 类型,以保持链接方法的能力。

找不到如何实现这一点的方法。也许有一个很好的模式可以帮助解决我不知道的这个问题。 有什么想法吗?

更新:

所以我想创建一个包含常用方法的抽象期望:

像这样:

abstract class CommonExpactations<T> {
    T expectSuccessResponseFromApi() {
        // do some logic and then return T
    }
    T expectFailResponseFromApi() {
        // do some logic and return T
    }
}

并不是每个 *Expectations 特定接口的实现都应该扩展 CommonExpactations 以获得对公共方法的访问。 但是java不允许在抽象类中创建T类型的新对象,以便在具体实现中链接其他一些方法。

例如,

UserExpectationsImpl implements UserExpectations extends CommonExpactations<UserExpectations>

【问题讨论】:

  • 通过泛型实现,并有一个由子类实现的protected abstract T newInstance();
  • 您应该为您的“更新”发布minimal reproducible example(另请注意,在第二种方法返回类型T UserExpectations expectFailResponseFromApi 中有错字)

标签: java oop


【解决方案1】:

泛型怎么样?

public interface Expecations<T> {
    T expectSuccessResponseFromApi();
    T expectFailResponseFromApi();
    ....

}


public interface UserExcpectations extends Expecations<User> {

}

【讨论】:

  • UserExcpectations 不需要了解任何有关 expectOrderInCart 或 expectOrderInDB 的信息。但是在您的示例中确实如此,而且我想实现这些常用方法。所以在这种情况下,UserExcpectations 和 OrderExpectations 的每个实现都可以访问它们的实现
  • @user3127896, expectOrderInCart & expectOrderInDB 是 OrderExpectations 接口中的方法。这些对于 UserExpectations 接口并不常见。没有 UserExpectations 知道这些方法的地方。目标是抽象 UserExcpectations 和 OrderExpectations 接口中的常用方法,对吗?如果是,根据建议的答案,有一个 Expectations 接口并在 UserExcpectations 和 OrderExpectations 接口中扩展它
  • 你是对的,但问题是我想要实现这些常用方法,而不仅仅是接口中的声明
  • 我建议您使用 java8 接口,您可以使用这些接口为方法提供默认实现。 docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
  • 是的,我知道默认方法,但问题是为了实现这些常用方法,我需要注入其他对象,而我无法在接口中执行此操作。这就是为什么我一直在寻找如何使用抽象类来实现它。
【解决方案2】:

尝试使用抽象类的匿名对象创建。

abstract class CommonExpactations<T> {
     T expectSuccessResponseFromApi() {
         // do some logic and then return T
     }
    T expectFailResponseFromApi() {
       // do some logic and return T
    }
}

在 CommonExpectations 的子接口中,说 UserExpectations

CommonExpectations ce = new CommonExpectations<UserExpectations>(){

   //provide abstract method implementations
}

【讨论】:

  • 有什么意义?实现应该放在一个地方而不是每个子界面中
猜你喜欢
  • 2021-05-10
  • 1970-01-01
  • 2013-09-13
  • 2014-04-23
  • 2011-09-16
  • 1970-01-01
  • 2018-08-23
  • 2014-10-25
  • 1970-01-01
相关资源
最近更新 更多