美文网首页
Kotlin的operator与by实现委托模式

Kotlin的operator与by实现委托模式

作者: 爱学习的蹭蹭 | 来源:发表于2019-12-01 09:02 被阅读0次

    kotlin的类的委托是通过operator与by关键进行处理,委托作为一种传统的设计模式,在Java中要想实现这种设计模式,就需要自己进行类的结构设计来实现。而在Kotlin中,提供语言层面上的支持,我们可以通过by关键字很轻松就能实现

    案例1

    • 爷爷奶奶给了100块孙子,而且他孙子委托媳妇洗碗(儿子委托妈妈洗碗,儿子的压岁钱减半)
    package com.kotlin.flong.oop_fp
    import kotlin.reflect.KProperty
    //类的委托
    fun main(args: Array<String>) {
        var myson = MySon()
        //爷爷奶奶给了100块
        myson.money =100
        //取压岁钱
        println(myson.money)
    }
    
    class MySon {
        //压岁钱
        var money: Int by Mother()
    }
    
    class Mother {
        //儿子的压岁钱
        var mySonMoney = 0
        //自己的钱包,妈妈的钱包
        var myWallt = 0
        operator fun getValue(myson: MySon, p: KProperty<*>): Int {
            return mySonMoney;
        }
        operator fun setValue(myson: MySon, p: KProperty<*>, i: Int) {
            mySonMoney = 50
            myWallt += i - 50
        }
    }
    

    案例2

    • 儿子的爸爸委托儿子洗碗
    //类的委托
    
    fun main(args: Array<String>) {
        val son = SonFather()
        son.wash()
    }
    
    interface WashPower{
        //洗碗的行为
        fun wash()
    }
    
    class Son1 :WashPower{
        override fun wash() {
            println("儿子开始洗碗")
        }
    }
    
    //儿子的爸爸委托儿子洗碗
    class SonFather :WashPower by Son1(){
    }
    

    案例三

    只有有洗碗的能力都委托给他

    //类的委托
    fun main(args: Array<String>) {
        val son = SonFather1(BigSon())
        son.wash()
    }
    
    interface WashPower1{
        //洗碗的行为
        fun wash()
    }
    
    class BigSon :WashPower1{
        override fun wash() {
            println("儿子开始洗碗")
        }
    }
    
    // 只有有洗碗的能力都委托给他
    class SonFather1(var wash:WashPower1) :WashPower1 by  wash{
        override fun wash() {
            println("给儿子一块钱")
            wash.wash()
            println("继续")
        }
    }
    
    

    案例源代码

    相关文章

      网友评论

          本文标题:Kotlin的operator与by实现委托模式

          本文链接:https://www.haomeiwen.com/subject/hxtkwctx.html