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

Posted

技术标签:

【中文标题】如何关联两个不相关的类,以便它们可以在抽象类中用于相同的方法【英文标题】: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 模式文件中单独生成的, 【参考方案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<>();
    

【讨论】:

以上是关于如何关联两个不相关的类,以便它们可以在抽象类中用于相同的方法的主要内容,如果未能解决你的问题,请参考以下文章

js抽象工厂模式

抽象工厂

抽象类和接口有什么区别?

接口和抽象类

抽象工厂模式

我可以在用于SQLite的类中使用String列表吗?