25:kotlin 类和对象 -- 委托(Delegation )

委托模式已被证明是实现继承的一种良好替代方案,而 kotlin对其提供本地支持,无需编写样板代码

实现类(Derived)可以将公共成员委托给其他类来实现一个接口(Base)

interface Base {
    fun print()
}

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

class Derived(b: Base) : Base by b	// 将公共成员委托给b

fun main() {
    val b = BaseImpl(10)
    Derived(b).print()	// 这将调用 BaseImpl 的 print 方法
}

The by clause in the supertype list for Derived indicates that b will be stored internally in objects of Derived and the compiler will generate all the methods of Base that forward to b.

覆盖委托实现的成员

覆盖的工作方式符合你的期望:编译器将使用你的覆盖实现,而不是委托对象中的实现。如果你想向 Derived 添加 override fun printMessage() { print("abc") },则在调用 printMessage 时程序将打印 abc而不是 10

interface Base {
    fun printMessage()
    fun printMessageLine()
}

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

class Derived(b: Base) : Base by b {
    override fun printMessage() { print("abc") }
}

fun main() {
    val b = BaseImpl(10)
    Derived(b).printMessage()   // abc
    Derived(b).printMessageLine()   // 10
}

请注意,以这种方式覆盖的成员不会被委托对象的成员调用,委托对象只能访问其自己的接口成员实现

interface Base {
    val message: String
    fun print()
}

class BaseImpl(val x: Int) : Base {
    override val message = "BaseImpl: x = $x"
    override fun print() { println(message) }
}

class Derived(b: Base) : Base by b {
    override val message = "Message of Derived" // 当前成员不会被委托对象的成员访问
}

fun main() {
    val b = BaseImpl(10)
    val derived = Derived(b)
    derived.print()
    println(derived.message)
}
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值