kotlin - как ссылаться на делегат, если в переопределении есть то же имя метода? - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь проанализировать следующий пример кода :

class StylingAndroidTextClassifier(
        private val context: Context,
        private val fallback: TextClassifier,
        private val factory: TextClassifierFactory = FrameworkFactory()
) : TextClassifier by fallback {

    private val stylingAndroid = "Styling Android"
    private val stylingAndroidUri = "https://blog.stylingandroid.com"
    private val regex = Regex("Styling\\s?Android", RegexOption.IGNORE_CASE)

    override fun suggestSelection(request: TextSelection.Request): TextSelection {
        return fallback.suggestSelection(request)

    }

    override fun classifyText(request: TextClassification.Request): TextClassification {
        return fallback.classifyText(request)
    }
}

Мой вопрос связан с тем, почему на резервную ссылку нужно ссылаться вообще.Класс должен теперь включать методы возврата, но в этом конкретном случае имена методов будут конфликтовать.в таком случае это то, почему мы используем fallback.suggestSelection (), а не просто offertionSelection () ?я хочу знать, почему автор должен делегировать запасной вариант?

Вместо этого я думал, что это сработает:

 @SuppressLint("NewApi")
    override fun suggestSelection(request: TextSelection.Request): TextSelection {
        return suggestSelection(request)
       // return fallback.suggestSelection(request)
    }

обратите внимание, как убрать запасной вариант.это будет бесконечный цикл, или это вызовет в альтернативной реализации "offerSelection?

1 Ответ

0 голосов
/ 15 октября 2018

Суть вопроса в том, зачем нам нужен следующий вызов:

 override fun suggestSelection(request: TextSelection.Request): TextSelection {
        return fallback.suggestSelection(request)}

, когда private val fallback: TextClassifier явно включен, тогда почему и явный квалификатор.

Основная причина в том, что если мы напишем подобный код, то в зависимости от языка программирования может произойти одно из двух:

 override fun suggestSelection(request: TextSelection.Request): TextSelection {
        return suggestSelection(request)}
  1. A Рекурсивный вызов,который в этом случае не имеет точки останова, то есть бесконечен
  2. Неоднозначный вызов, когда компилятор не знает, на который suggestSelection он ссылается, в любом случае лучше явно указывать имя объекта как fallback, чтобы во время выполнения было ясно, , какой метод нужно вызвать
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...