Можно ли создать метод, используя эти интерфейсы в качестве параметров? - PullRequest
1 голос
/ 20 февраля 2020

Я не уверен, как сформулировать мою проблему, чтобы она была понятна. Но я постараюсь изо всех сил:

У меня есть 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

И, как вы можете видеть, Я не хочу вводить каждый сетевой вызов каждый раз, когда использую каждый интерфейс.

Ответы [ 3 ]

1 голос
/ 20 февраля 2020

Я так понимаю:

Эти четыре интерфейса не нужны. Все они имеют одинаковый интерфейс:

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 {
    }

Я не думаю, что это нужен

0 голосов
/ 20 февраля 2020

Помимо ответа @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
}
0 голосов
/ 20 февраля 2020

Я думаю, что закрытая иерархия классов может удовлетворить ваши потребности. Здесь Подробнее об этом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...