kotlin学习日记(5)

2020-11-12  本文已影响0人  海东青_fb7a

代理模式
客户端使用一个代理对象实现对真实对象的访问,代理对象和真实对象实现相同的接口,代理对象持有真实对象

Kotlin中,委托的实现依靠于关键字 by ,by表示将实现接口的真实对象(by后边的实例)保存在代理对象的内部,比如SportsManager类继承于ISports接口,并可以ISports接口的所有的 public 方法委托给一个指定的对象。

interface ISports {
  fun doSports()
}
class SwimForSports: ISports{
override fun doSports() {
  println("do swim")
}
}
class SportsManager(sport: ISports): ISports by sport

fun main(args: Array<String>) {
  val swimSports: SwimForSports = SwimForSports()
  SportsManager(swimSports).doSports()// Log:do swim
}
class Bean {
    val str by lazy {
        println("Init lazy")//只有第一次初始化走这步
        "Hello World"
    }
}

在Android开发中 我们会常常用的 by lazy 放一段 BaseActivity 延迟加载 初始化 DataBinding 和 ViewModel 操作

val/var <property name>: <Type> by <expression>

by关键字之后的表达式就是委托,属性的get()方法(以及set() 方法)将被委托给这个对象的 getValue()和setValue()方法.属性委托不必实现任何接口, 但必须提供 getValue() 函数(对于 var属性,还需要 setValue() 函数)。

Sealed class(密封类) 是一个有特定数量子类的类,看上去和枚举有点类似,所不同的是,在枚举中,我们每个类型只有一个对象(实例);而在密封类中,同一个类可以拥有几个对象。

Sealed class(密封类)的所有子类都必须与密封类在同一文件中

Sealed class(密封类)的子类的子类可以定义在任何地方,并不需要和密封类定义在同一个文件中

Sealed class(密封类)没有构造函数,不可以直接实例化,只能实例化内部的子类

sealed class SealedClass{
    class SealedClass1():SealedClass()
    class SealedClass2():SealedClass()
    fun hello(){
        println("Hello World ... ")
    }
}
fun main(args:Array<String>){
    var sc:SealedClass = SealedClass()//这里直接编译报错
}
fun main(args:Array<String>){
    var sc:SealedClass = SealedClass.SealedClass1()//只能通过密封类内部的子类实例化对象,这时就可以执行里面的方法了
    sc.hello()
}
上一篇 下一篇

猜你喜欢

热点阅读