Kotlin - замените один интерфейс с двумя методами двумя различными интерфейсами с одним методом - PullRequest
0 голосов
/ 25 июня 2018

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

Скажем, у меня есть метод, который принимает интерфейс в качестве параметра, и в указанном интерфейсе есть два метода.

В kotlin, реализующем интерфейс анонимно, мы получили бы что-то вроде

client.execute(object : Callback() {
    override fun onResponse(response: Response) {/*...*/}
    override fun onError(error: Error) {/*...*/}
})

Я хотел бы создать расширения для объекта client, которые бы имели два разных интерфейса, например

interface ClientResponse{fun onResponse(response: Response)}
interface ClientError{fun onError(error: Error)}

и тогда новый метод execute будет выглядеть как

client.executeCustom(
    {response -> /*...*/},
    {error -> /*...*/}
})

что-то вроде решения SAM.

Возможно ли это как-нибудь?

1 Ответ

0 голосов
/ 25 июня 2018

Это должно быть довольно тривиальное расширение для записи, вы можете просто сразу взять два лямбда-параметра и затем создать экземпляр Callback внутри, который делегирует вызовы этим лямбдам:

fun Client.executeCustom(onResponse: (Response) -> Unit, onError: (Error) -> Unit) {
    execute(object : Callback() {
        override fun onResponse(response: Response) = onResponse(response)
        override fun onError(error: Error) = onError(error)
    })
}

Таким образом,вам даже не нужно вводить новые интерфейсы.

...