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
相关产品推荐
相关产品推荐

