从接口中提取常用方法

时间:2017-01-15 17:02:06

标签: java oop

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

看起来像这样:

interface UserExpectations {
    UserExpectations expectSuccessResponseFromApi;
    UserExpectations expectFailResponseFromApi;


    UserExpectations expectUserInDB;
    // more user-specific methods
}

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

现在我需要添加一个期望类,并且有一些常见的逻辑,即前两种方法。

所以它看起来像这样:

interface OrderExpectations {

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


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

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

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

更新:

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

像这样:

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>

2 个答案:

答案 0 :(得分:1)

使用仿制药怎么样?

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

}


public interface UserExcpectations extends Expecations<User> {

}

答案 1 :(得分:0)

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

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
}