泛型
高阶函数
apply,对该对象进行处理,最终返回对象本身
kotlin
fun test1(t: Teacher?): Teacher? = t?.apply {
t.name
t.yell()
}
委托模式
通过类的继承可以获取基类的属性和方法 使用委托,一个类C并不真正的实现一个接口A,而是通过注入这个接口的实现类B对象,通过这个实现类B去调用接口A中的属性和方法 相当于C委托B去实现A,而C并不真正去实现接口A 委托有什么好处,为什么要引入委托来替代继承?
kotlin
fun main() {
//1.使用继承,可以获取获取基类的所有属性
BaseImpl().print()
//2.委托模式
Derived(BaseImpl()).print()
//3.kotlin原生语法支持
//效果与2一样
Derived1(BaseImpl()).print()
}
interface Base {
fun print() = println("base print")
}
class BaseImpl : Base {
override fun print() = println(" BaseImpl hello")
}
//现在将一个Base的实现类作为属性保存在Derived类中,同样Derived也实现Base接口
//但是真正实现这个接口的是保存进来的这个属性,而不是Derived类
class Derived(val base: Base):Base{
override fun print() {
return base.print()
}
}
//kotlin的原生语法支持
class Derived1(val base:Base):Base by base
委托的用处
属性委托
lazy
kotlin
// 内置的委托函数 lazy
class LazyExample {
val value:String by lazy {
"类似延迟加载的效果"
}
}
观察者模式
kotlin
class ObserveExample{
//每次value被重新赋值,都会执行Delegates.observable委托方法,实现观察者模式
var value:String by Delegates.observable("lixu"){
property, oldValue, newValue -> println("$property 发生变化,初始值为$oldValue 新的值为$newValue")
}
}
密封类
只允许在统一模块下被继承实现类的类,在其他模块不能被继承。 并且密封类的所有实现类都是一开始定义好的,其他模块下无法实现密封类