如何将两个不相关的 class 联系起来,以便它们可以在抽象 class 中用于相同的方法

How to relate two unrelated classes so they can be used in abstract class for same method

我有两个 json 模式文件,其中两个 classes 是使用 jackson- 生成的 CarSearchResponse 和 HomeSearchResponse。他们没有关系。

在我的实现中,我创建了一个具有通用功能的抽象class,然后为 Car 和 Home 创建了两个具体实现。

abstract class SearchResponseFlow {
    void execute() {
        responseFlow.map(response);
    }

    abstract ResponseWrapper<SearchResponse> getData(); // SearchResponse is imaginary, what change can I make to make it accept both CarSearchResponse and HomeSearchResponse.
}

class HomeSearchResponseFlow extends SearchResponseFlow {
    void map(HomeSearchResponse resp) {
        // logic
    }

    ResponseWrapper<HomeSearchResponse> getData() {
        // logic
    }
}

class CarSearchResponseFlow extends SearchResponseFlow {
    void map(CarSearchResponse resp) {
        // logic
    }

ResponseWrapper<CarSearchResponse> getData() {
        // logic
    }
}

SearchResponse 是虚构的,因为 CarSearchResponse 和 HomeSearchResponse 都没有实现 SearchResponse,因为它们都是从不同的 JSON 模式文件中单独生成的,我可以做些什么改变让它接受 CarSearchResponse 和 HomeSearchResponse。 我也必须在外面消费 *SearchResponse,那该怎么办?

您可以使用泛型来做到这一点:

class ResponseWrapper<T>{

}
class HomeSearchResponse {
}

class CarSearchResponse {
}

abstract class SearchResponseFlow<T> {

    public void execute(T response) {
        System.out.println(response);
    }

    abstract ResponseWrapper<T> getData();
}

class HomeSearchResponseFlow extends SearchResponseFlow<HomeSearchResponse> {

    @Override
    public void execute(HomeSearchResponse homeSearchResponse) {
        System.out.println(homeSearchResponse);
    }

    @Override
    ResponseWrapper<HomeSearchResponse> getData() {
        return new ResponseWrapper<>();
    }

}

class CarSearchResponseFlow extends SearchResponseFlow<CarSearchResponse> {

    @Override
    public void execute(CarSearchResponse carSearchResponse) {
        System.out.println(carSearchResponse);
    }

    @Override
    ResponseWrapper<CarSearchResponse> getData() {
        return new ResponseWrapper<>();
    }
}