Как избежать конфликтов перегрузки в Kotlin? - PullRequest
1 голос
/ 02 мая 2020

Предположим, у меня есть эти интерфейсы

interface BaseDatabase

interface UpdatingDB {
    fun getSessionStat(): UpdaterSessionStat
}

interface InsertingDB {
    fun getSessionStat(): InserterSessionStat
}

И я хочу, чтобы класс реализовал их все

class MyDB: BaseDatabase, UpdatingDB, InsertingDB {
    override fun getSessionStat(): UpdaterSessionStat {
        TODO("Not yet implemented")
    }

    override fun getSessionStat(): InserterSessionStat {
        TODO("Not yet implemented")
    }
}

Но это приводит к ошибке перегрузки. Каковы возможные исправления \ обходные пути, чтобы один класс мог реализовать все эти интерфейсы? С исключением случаев изменения самих интерфейсов.

Ответы [ 2 ]

1 голос
/ 02 мая 2020

В одном классе нельзя использовать два метода с одинаковым именем и одинаковыми параметрами. В качестве обходного пути вы можете иметь конструктор с параметрами типов интерфейсов:

class MyDB(val updatingDB: UpdatingDB, val insertingDB: InsertingDB): BaseDatabase {
    fun getSessionStat1(): UpdaterSessionStat {
        return updatingDB.getSessionStat()
    }
    fun getSessionStat2(): InserterSessionStat {
        return insertingDB.getSessionStat()
    }
}

Реализация этих интерфейсов в разных классах:

class UpdatingDBImpl : UpdatingDB {
    override fun getSessionStat(): UpdaterSessionStat {
        // ...
    }
}

class InsertingDBImpl : InsertingDB {
    override fun getSessionStat(): InserterSessionStat {
        // ...
    }
}
0 голосов
/ 02 мая 2020

Это никогда не будет возможно. Если два метода имеют одно и то же имя и принимают одинаковые аргументы, компилятор никогда не сможет сказать, какой из них вызвать, и поэтому не сможет скомпилировать. Нет никакого способа решить, какую инструкцию обрабатывать дальше. (Вывод из-за того, как возвращаемое значение используется, нежизнеспособен, потому что это принесет ущерб безопасности типов: что, если вы действительно имели в виду other one?)

Возможно, вы захотите взглянуть на Kotlin spe c, в котором упоминается:

Если после этих шагов [разрешения перегрузки] все еще есть несколько кандидатов, которые в равной степени применимы для вызова, это неоднозначность перегрузки, которая необходимо сообщать как ошибку времени компиляции.

Конечно, существует бесчисленное множество способов переписать код, чтобы избежать этого, и лучшее зависит от вашей более широкой программы. Однако в основе этого вопроса, когда эти методы вызываются, вы должны знать, какой из методов ожидает вызывающий объект, и вы должны использовать эту информацию для передачи вызывающему объекту объекта, который реализует только соответствующий интерфейс.

...