Kotlin-在重写中具有相同的方法名称时如何引用委托?

时间:2018-10-15 02:53:07

标签: kotlin

我正在尝试分析following sample code

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

我的问题与为什么必须引用回退有关。现在,该类应包括fallbacks方法,但是在这种特定情况下,方法名称将发生冲突。在这种情况下,这就是为什么我们使用fallback.suggestSelection()而不是仅仅proposalionSelection()的原因?我想知道为什么作者必须委托回退?

相反,我以为这会起作用:

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

请注意我如何删除后备广告。这将是一个无限循环,还是会调用“ suggestSelection”的后备实现?

1 个答案:

答案 0 :(得分:2)

  

问题的关键是,为什么我们需要以下调用:

 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. 递归调用,在这种情况下没有断点,因此是无限的
  2. 一个不明确的调用,编译器不知道该调用是指哪个suggestSelection,无论哪种情况,最好以fallback之类的对象名称来明确限定,以便在运行时清晰可见-时间,需要调用哪种方法