【问题标题】:How to relate two unrelated classes so they can be used in abstract class for same method如何关联两个不相关的类,以便它们可以在抽象类中用于相同的方法
【发布时间】:2021-11-05 10:22:25
【问题描述】:

我有两个 json 模式文件,使用 jackson 从中生成了两个类- CarSearchResponse 和 HomeSearchResponse。它们不相关。

在我的实现中,我创建了一个具有通用功能的抽象类,然后为 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,那该怎么办?

【问题讨论】:

  • 假设HomeSearchResponse等实现了SearchResponse,你可以只做ResponseWrapper&lt;? extends SearchResponse&gt;。您还应该更改子类中的 getData 方法以返回 ResponseWrapper&lt;? extends SearchResponse&gt;
  • 使用通用抽象类 SearchResponseFlow { abstract ResponseWrapper getData();}
  • SearchResponse 是虚构的,因为 CarSearchResponse 和 HomeSearchResponse 都没有实现 SearchResponse,因为它们都是从不同的 JSON 模式文件中单独生成的,

标签: java oop generics


【解决方案1】:

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

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<>();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 2023-03-30
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多