第二部分:面向对象编程与 Kotlin 特性
第9章:委托与代理
9.1 类委托
什么是类委托?
类委托(Class Delegation)是 Kotlin 中一种通过组合替代继承的设计模式实现方式。它允许一个类将部分或全部功能委托给另一个类的实例,从而减少代码重复并提高灵活性。
类委托的语法
Kotlin 通过 by 关键字实现类委托。基本语法如下:
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { println(x) }
}
// 通过 by 将 Derived 类的 print() 委托给 base 实例
class Derived(b: Base) : Base by b
fun main() {
val b = BaseImpl(10)
Derived(b).print() // 输出:10
}
类委托的优势
- 避免继承的局限性:
Kotlin 默认类为final,通过委托可以复用实现而无需继承。 - 明确职责分离:
委托类只需关注自身逻辑,通用功能由被委托类处理。 - 动态切换实现:
运行时可以更换被委托的实例,更灵活。
实际应用场景
- 接口实现复用:
当多个类需要实现相同接口但行为不同时,可将公共逻辑委托给统一实现。 - 装饰器模式:
动态扩展对象功能,例如:class LoggingDelegate(val base: Base) : Base by base { override fun print() { println("Before printing") base.print() println("After printing") } }
注意事项
- 委托仅对接口中声明的方法生效,非接口方法无法委托。
- 被委托类的成员属性不会被自动委托,需手动处理。
与继承的对比
| 特性 | 继承 | 类委托 |
|---|---|---|
| 耦合度 | 高(子类依赖父类实现) | 低(通过接口解耦) |
| 灵活性 | 编译时确定 | 运行时可替换被委托对象 |
| 多继承支持 | 不支持 | 可通过多个接口委托实现 |
通过类委托,Kotlin 提供了一种更符合组合优于继承原则的代码复用方式。
