当我使用扩展类时,应该在kotlin中的哪一个与它之间使用?

时间:2018-06-29 00:51:14

标签: android kotlin

ScreenDef是一个类,我为该类添加了一个函数setDevice,在代码A和代码B之间哪个是正确的?为什么?

我认为代码B是正确的,对吧?

代码C

data class ScreenDef(
     val brightness: Int
): DeviceDef


class ScreenHelper(val mContext: Context) {    
    fun setScreen(aScreenDef: ScreenDef){    
    }
}

代码A

fun ScreenDef.setDevice(mContext: Context) {
    ScreenHelper(mContext).setScreen(this)
}

代码B

fun ScreenDef.setDevice(mContext: Context) {
    ScreenHelper(mContext).setScreen(it)
}

1 个答案:

答案 0 :(得分:3)

您应该使用this。如果lambda中只有一个参数,则it被称为简写。

context?.let { 
    it.resources.getInt(R.int.anyint) // just for example
}

在上面的代码段中,it是lamda参数的简写形式(在只有一个参数的情况下)。

context?.let { cxt -> // here we have manually defined a parameter
    cxt.resources.getInt(R.int.anyint) // just for an example
}

在此代码段中,我们创建的itcxt完全相同,而不是it


实际上,您误解了扩展功能的概念。

您正在创建数据类ScreenDef,并想为其创建扩展函数,为什么?如果您真的想拥有一个成员函数,只需创建一个普通的类并在其中包含一个函数。

当您未维护目标类时,应创建扩展功能。例如:活动,片段不由您维护,如果您想添加自定义函数,则必须对其进行扩展并执行。因此,为防止扩展功能出现,它们非常方便,这就是我们喜欢它的原因。

您可以说,为我们创建的类创建扩展功能有什么问题。这可能是正确的,也可能不是正确的。这实际上取决于。

让我们举个例子,假设我们已经开发了一个在画布上绘制简单符号的库,并且我们创建了几个函数。事实证明它是如此之好以至于人们正在使用它,我们决定创建高级版本,该版本可以绘制需要使用我们已经开发的简单库的更复杂的符号。因此,当我们扩展简单库的类时,我们可能需要一些功能来改进某些东西等。在这种情况下,如果我们将简单库作为依赖项导入,那么创建扩展函数就很好了,否则我们将不得不再创建一个子库类并创建所需的功能。如果我们将lib作为源代码导入,则可以直接在源代码中创建一个函数。

希望对您有帮助。