kotlin: 使用 by 关键字进行类委托

一,功能

Kotlin 的委托(Delegation)特性通过语法层面的支持,简化了委托模式的实现,
分为‌类委托‌和‌属性委托‌两种核心形式

类委托: 通过 by 关键字将接口或抽象类的实现委托给其他对象,避免继承的局限性

二,例子:

代码:

/**
 * 定义一个学习接口 , 代表有学习的能力
 */
interface IStudy {
    /**
     * 抽象方法 , 学习
     */
    fun study()
}

/**
 * 定义学生类 , 实现学习接口 , 其有学习的能力
 */
class Student : IStudy {

    /**
     * 实现的学习抽象方法
     */
    override fun study() {
        println("学习")
    }
}

/**
 * 坏学生不学习 , 虽然实现了学习接口 , 但是其委托 普通学生来学习 , 自己什么都不做
 */
class BadStudent : IStudy by Student() {
}

/**
 * 最好的学生
 * 委托 学生学习 , 自己额外学习更多东西
 */
class BestStudent : IStudy by Student() {
    /**
     * 委托其它类后 , 也可以自己实现该类 , 在委托方法的前后可以执行其它额外操作
     */
    override fun study() {
        println("复习之前的知识")
        Student().study()
        println("加强学习")
    }
}

调用:

        //处理按钮点击事件
        binding.button1.setOnClickListener {
            // I . 测试接口实现类

            //创建 接口实现类 对象
            var goodStudent : Student = Student()

            //执行实现的内容: 学习
            goodStudent.study()

            // II . 测试委托

            // 创建 使用委托实现接口 类的对象
            var badStudent : BadStudent = BadStudent()

            //执行委托的方法 : 学习
            badStudent.study()

            //III . 测试委托的同时额外执行其它操作

            //创建 使用委托实现接口并执行额外操作 类的对象
            var bestStudent : BestStudent = BestStudent()

            //执行委托方法和额外操作,复习之前的知识,学习,加强学习
            bestStudent.study()
        }

运行结果:

image

三,例子:

代码:

interface Base {
    fun print()
}

class BaseImpl(val x: Int) : Base {
    override fun print() { println(x) }
}

class Derived(b: Base) : Base by b   // 将 Base 接口的实现委托给对象 b

调用:

        //处理按钮点击事件
        binding.button2.setOnClickListener {
            val b = BaseImpl(10)
            //创建对象
            val der = Derived(b)
            der.print()  // 输出 10
            //不返回对象直接执行方法也可以
            Derived(b).print()  // 输出 10
        }

运行结果:

image

 

posted @ 2025-09-06 08:39  刘宏缔的架构森林  阅读(16)  评论(0)    收藏  举报