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()
}
运行结果:

三,例子:
代码:
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
}
运行结果:
![]()
浙公网安备 33010602011771号