针对Kolin文档中提供委托代码的补充

在kotlin文档中,委托一章的最后一段内容,提供委托,其代码是不全的,导致学习者可能对这一章内容缺乏更细节的了解,这里补充一下:
网页上的代码如下,只做了类的基本设计,缺乏实现细节
在这里插入图片描述
在这里插入图片描述我们补充如下:

//提供委托
//通过定义 provideDelegate 操作符,可以扩展创建属性实现所委托对象的逻辑。
//如果 by 右侧所使用的对象将provideDelegate定义为成员或扩展函数,那么会调用该函数来创建属性委托实例。
//provideDelegate的其中一个应用场景是用来在实例初始化之前确定属性是否存在
//例如,如果要在绑定之前检测属性名称,可以这样写:

//以下代码的构建顺序如下:
//class MyUI()
//  -> MyUI.某属性(开始调用getValue方法的委托)
//      -> fun bindResource(id:ResourceID),类中的某个属性被委托到bindResource方法
//          -> class ResourceLoader(id:ResourceID),bindResource()方法启动class ResourceLoader()
//              -> fun provideDelegate(thisRef: MyUI,property: KProperty<*>)
//                  -> fun checkProperty(thisRef: MyUI,name:String)
//                  -> class ResouceDeleating()
//                      -> getValue(thisRef: MyUI, property: KProperty<*>) : Int
class ResourceDeleating:ReadOnlyProperty<MyUI,Int>{
    var curValueText : Int= 8888
    var curValueImage : Int = 7777
    override fun getValue(thisRef: MyUI, property: KProperty<*>): Int {
        return if (property.name == "image"){
            this.curValueImage
        }else{
            this.curValueText
        }
    }
//    由于是ReadOnlyProperty,所以没有setValue
//    override fun setValue(thisRef: MyUI, property: KProperty<*>,value:Int) {
//        if (property.name == "image"){
//            this.curValueImage = value
//        }else{
//            this.curValueText = value
//        }
//    }
}

class ResourceLoader(id:ResourceID){
    //请注意,provideDelegate 方法只影响辅助属性的创建,并不会影响为 getter 或 setter 生成的代码。
    private val id: ResourceID = id
    operator fun provideDelegate(thisRef: MyUI, property: KProperty<*>) : ReadOnlyProperty<MyUI,Int>{
        this.checkProperty(thisRef,property.name)
        return ResourceDeleating()
    }
    private fun checkProperty(thisRef: MyUI,name:String) {
        if (name == this.id.value){
            println("field name is $name, existed in thisRef:$thisRef")
        }else{
            println("no such field in ,thisRef: $thisRef")
        }
    }
}
enum class ResourceID(val value:String){
    image_id("image"),
    text_id("text"),
}
class MyUI{
    fun bindResource(id:ResourceID) : ResourceLoader{
        return ResourceLoader(id)
    }
    val image by bindResource(ResourceID.image_id)
    val text by bindResource(ResourceID.text_id)

}
fun DelegateRequiresRun(){
    var myui = MyUI()
    println("MyUI's image_id is: ${myui.image}")
    println("MyUI's text_id is: ${myui.text}")
	// MyUI's image_id is: 7777
	// MyUI's text_id is: 8888
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页