Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 私有扩展的用途是什么_Kotlin - Fatal编程技术网

Kotlin 私有扩展的用途是什么

Kotlin 私有扩展的用途是什么,kotlin,Kotlin,我遇到了以下代码: class BindableTextInputEditText : TextInputEditText { constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?

我遇到了以下代码:

class BindableTextInputEditText : TextInputEditText {

    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    fun bind() {
        setTextAndCursor(text)
    }

    private fun TextInputEditText.setTextAndCursor(text: String?) {

    }
}
我不清楚为什么setTextAndCursor是一个扩展。如果它是私有的,它就不能像大多数扩展那样真正通用。那么为什么要将它作为一个扩展而不仅仅是一个普通函数呢?

在您的特定情况下,扩展是在一个扩展receiver类的类(
TextInputItemText
)中声明的,因此声明一个常规方法的工作方式与扩展相同,或者至少产生相同的调用语法。所以我想说,在这里使用扩展是毫无意义的(有些人可能会在这里提到静态方法的性能..我不会走这条路)

尽管如此,我们通常不能拒绝私有扩展。扩展的要点不仅仅是一般用法,而是一种使用
object.method()
语法以更自然的方式表达静态助手的方法

这使得程序员可以调用类似的内置方法和扩展方法,这两种方法的可读性都很好。它在私有上下文中也非常有用,因为它的主要目标是良好的语法


如果
setTextAndCursor
是您希望在
textinputtext
上使用的方法,但它只在您的私有上下文中有用,那么将其声明为私有扩展是有意义的(除非您已经在该类的子类中,这是您的奇怪场景).

将其声明为扩展允许在任何
文本输入文本
上调用它,而不仅仅是在
(或
BindableTextInputitext
的其他实例)上调用它。你可以有这样的方法

fun bindOther(textField: TextInputEditText, text: String?) {
    textField.setTextAndCursor(text)
}
也许这样的用法在以前的类中已经被删除了

不知道你说的“好语法”是什么意思。我个人看不出它有什么“好”的地方。我所说的“好语法”是调用
myObj.doSomething()
,而不是静态等价物:
doSomething(myObj)
。根据方法的语义,就风格而言,前者可能更可取。此外,如果选择将方法调用与其他调用链接起来,可能会更美观。