【发布时间】: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中有错字)