You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin委托场景下,如何让代理类访问被委托类的方法?

Kotlin委托:让代理类访问被委托类方法的解决方案

现有代码定义

先看已有的接口与实现类:

interface ITagProvider {
    fun getTag(): String
}

interface ITagPrinter {
    fun printTag()
}

class TagPrinter(val tagProvider: ITagProvider): ITagPrinter {
    override fun printTag() {
        print(tagProvider.getTag())
    }
}

问题场景

当尝试通过Kotlin委托实现AnyClass时,IDE报错:'this' is not defined in this context,出错代码如下:

class AnyClass: ITagPrinter by TagPrinter(this), ITagProvider {
    override fun getTag() = "AnyClass"
}

错误原因是类初始化阶段,AnyClass实例还未创建完成,此时this指向的对象不存在,无法直接传递给TagPrinter构造函数。

解决方案

方案一:用lazy延迟初始化委托

通过lazy延迟创建TagPrinter实例,直到首次调用ITagPrinter的方法时才完成初始化,此时this已经可用:

class AnyClass: ITagPrinter by lazy { TagPrinter(this) }, ITagProvider {
    override fun getTag() = "AnyClass"
}

lazy特性会在第一次访问委托方法时执行lambda表达式,此时AnyClass实例已完全初始化,this可以安全传递给TagPrinter。

方案二:修改TagPrinter,延迟获取ITagProvider

调整TagPrinter的构造参数为lambda表达式,让它在需要时再获取ITagProvider实例:

// 修改后的TagPrinter
class TagPrinter(private val tagProviderGetter: () -> ITagProvider): ITagPrinter {
    override fun printTag() {
        print(tagProviderGetter().getTag())
    }
}

// 实现AnyClass
class AnyClass: ITagPrinter by TagPrinter { this }, ITagProvider {
    override fun getTag() = "AnyClass"
}

这种方式下,TagPrinter构造时不会立即获取tagProvider,而是在调用printTag时才通过lambda拿到已初始化的this。

内容的提问来源于stack exchange,提问作者leimenghao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:57:21