【问题标题】:Is it possible to create a method using these interfaces as parameters?是否可以使用这些接口作为参数创建方法?
【发布时间】:2020-06-04 14:52:02
【问题描述】:

我不知道如何表达我的问题以便清楚。但我会尽力道歉:

我有 4 个接口:

        interface OnGetViewPagerListener {
            void onSuccessViewPager(Response<Feed> response);
            void onFailedViewPager();
        }

        interface OnNextPageViewPagerListener {
            void onSuccessViewPagerNextPage(Response<Feed> response);
            void onFailedViewPagerNextPage();
        }

        interface OnGetGridViewListener{
            void onSuccessGridView(Response<Feed> response);
            void onFailedGridView();
        }

        interface OnNextPageGridViewListener{
            void onSuccessGridViewNextPage(Response<Feed> response);
            void onFailedGridViewNextPage();
        }

我正在将这些接口实现到我的 MainRepo 类中。在每个方法中,都包含一个网络调用:

主回购类

@Override
public void getPostsViewPager(OnGetViewPagerListener onGetViewPagerListener, String url) {

        //Network Call

        RetrofitInterfaces.IGetTop service = RetrofitClientInstance.getRetrofitInstance()
                .create(RetrofitInterfaces.IGetTop.class);
        Call<Feed> call = service.listRepos(url);
        call.enqueue(new Callback<Feed>() {
            @Override
            public void onResponse(@NonNull Call<Feed> call, @NonNull Response<Feed> response) {
                onGetViewPagerListener.onSuccessViewPager(response);
            }
            @Override
            public void onFailure(@NonNull Call<Feed> call, @NonNull Throwable t) {
                onGetViewPagerListener.onFailedViewPager();
            }
        });
}

是否可以使用网络调用和参数创建一个方法,以便我可以使用 4 个接口中的任何一个?

private makeNetworkCall(interface canUseAnyOfThe4InterfacesHere, String url){
    //Network call
}

如果这令人困惑,这是我的代码:

https://pastebin.com/y8kq9ZjQ

如您所见,我不想每次使用每个接口时都输入每个网络调用。

【问题讨论】:

  • private makeNetworkCall(interface canUseAnyOfThe4InterfacesHere, String url) -> 这个签名没有意义,接口不是DataType,它是一个关键字。您可以创建一个父接口,让您的接口扩展它,并传递该类型
  • @Stultuske 当然这没有意义。如果他们知道该怎么做,他们就不会问了。在“执行此操作的正确语法是什么”类型的问题中,无需指出语法怪异。
  • @FedericoklezCulloca 发布永远不会编译并声明的代码也没有意义:“这就是我想做的”
  • @Stultuske 实际的问题是“我应该在这个方法签名中放什么而不是 interface”但措辞不好
  • @jhamon 我也在评论中回答了。

标签: java android interface


【解决方案1】:

除了@Sharif ElKhatib 的回答,我认为这是最好的方法,另一种方法是编写这样的重载方法:

private makeNetworkCall( OnGetViewPagerListener ogvpl, String url){
    actualNetworkCaller(); //This has the actual logic of making the network call
}

private makeNetworkCall( OnNextPageViewPagerListener onpvl, String url){
    actualNetworkCaller(); //This has the actual logic of making the network call
}

// And methods for the other two interfaces

private void actualNetworkCaller(){
    //Network call
}

【讨论】:

    【解决方案2】:

    我对此的看法:

    这四个接口是不需要的。它们都是同一个界面:

    interface BaseCallback {
        void onSuccess(Response<Feed> response);
        void onFail();
    }
    

    那么你的函数:

    void makeCall(BaseCallback callback, String url) {
        //do call and then callback.onSuccess
    }
    

    如果你坚持不同的回调,

        interface OnGetViewPagerListener extends BaseCallback {
        }
    
        interface OnNextPageViewPagerListener extends BaseCallback {
        }
    
        interface OnGetGridViewListener extends BaseCallback {
        }
    
        interface OnNextPageGridViewListener extends BaseCallback {
        }
    

    我觉得没必要

    【讨论】:

    • BaseCallback 可能只是一个标记接口(没有任何方法)。这样就不需要对现有接口定义进行任何更改。但是,它们需要在使用前施放。
    【解决方案3】:

    我认为封闭的类层次结构可以满足您的需求。 Here 更多详情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 2021-02-02
      • 2016-09-05
      • 1970-01-01
      • 2019-03-19
      相关资源
      最近更新 更多