Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第二部分:面向对象编程与 Kotlin 特性

第二部分:面向对象编程与 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
}

类委托的优势

  1. 避免继承的局限性:
    Kotlin 默认类为 final,通过委托可以复用实现而无需继承。
  2. 明确职责分离:
    委托类只需关注自身逻辑,通用功能由被委托类处理。
  3. 动态切换实现:
    运行时可以更换被委托的实例,更灵活。

实际应用场景

  • 接口实现复用:
    当多个类需要实现相同接口但行为不同时,可将公共逻辑委托给统一实现。
  • 装饰器模式:
    动态扩展对象功能,例如:
    class LoggingDelegate(val base: Base) : Base by base {
        override fun print() {
            println("Before printing")
            base.print()
            println("After printing")
        }
    }
    

注意事项

  • 委托仅对接口中声明的方法生效,非接口方法无法委托。
  • 被委托类的成员属性不会被自动委托,需手动处理。

与继承的对比

特性继承类委托
耦合度高(子类依赖父类实现)低(通过接口解耦)
灵活性编译时确定运行时可替换被委托对象
多继承支持不支持可通过多个接口委托实现

通过类委托,Kotlin 提供了一种更符合组合优于继承原则的代码复用方式。

Last Updated:: 5/21/25, 7:58 PM