Skip to content

泛型

高阶函数

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

密封类

只允许在统一模块下被继承实现类的类,在其他模块不能被继承。 并且密封类的所有实现类都是一开始定义好的,其他模块下无法实现密封类

异常模式