Kotlin笔记4-可见性修饰符和扩展函数

参考自官网介绍:http://kotlinlang.org/docs/reference/extensions.html

1. Visibility Modifiers 可见性修饰符

可见性修饰符有四种:privateprotectedinternal and public,默认是public

可以用于修饰类、伴生对象object、接口、构造函数、一般函数、属性和其setter方法,getter方法和其属性可见性一致。

internal修饰的,是module内可见,对应于Android Studio中的一个module。

protected不能同于顶级声明,即直接在一个package中声明,其声明的可对于子类可见。

⚠️注意:局部变量,局部方法,局部类(?什么叫Local classes)不能有Visibility Modifiers

2. 扩展函数

类似于C#,扩展函数可以在不继承一个类,以及不使用任何设计模式(如装饰者模式)的的前提下,扩展一个类的功能。在函数名前加一个接受者类型,和一个点 ,例如为MutableList类扩展一个swap方法

fun MutableList<Int>.swap(index1: Int, index2: Int) {
    val tmp = this[index1] // 'this' corresponds to the list
    this[index1] = this[index2]
    this[index2] = tmp
}

其中,this表示接收者的类型,现在可以如下调用

val l = mutableListOf(1, 2, 3)
l.swap(0, 2) // 'this' inside 'swap()' will hold the value of 'l'

通过使用范型,可以在改变后,用于所有类型,如下:

fun <T> MutableList<T>.swap(index1: Int, index2: Int) {
    val tmp = this[index1] // 'this' corresponds to the list
    this[index1] = this[index2]
    this[index2] = tmp
}

通过在函数名称前添加范型类型T,可以在接受者类型中使用该范型T

当类已经有一个和扩展函数同名的函数时,在调用该函数时,会调用成员函数的方法,参数列表不一致时除外。

3. 扩展属性

和扩展函数一样,Kotlin支持扩展属性,以简化代码的编写。

val <T> List<T>.lastIndex: Int
    get() = size - 1

⚠️注意:只能通过提供getters/setters的方式来定义扩展属性。

val Foo.bar = 1 // error: initializers are not allowed for extension properties

猜你喜欢

转载自blog.csdn.net/unicorn97/article/details/81368906