kotlin - Kotlin 委托如何从委托对象访问类属性
问题描述
我试图将一些工作从一个巨大的类中分离出来,以提供更多的可读性。首先我研究了扩展,但似乎它只是创建了一些静态函数,然后委托模式进入了我的视野。
下面的代码看起来没问题,委托就像 EnhancedProducer 类的一部分一样工作。但是有一个问题阻止了我,我不太明白如何从委托访问 EnhancedProcuder 类的服务属性。在我的真实代码中,有一些情况是原始类和委托类都需要同时使用服务变量,所以不知道有没有办法做到。
我确实知道我们可能可以将服务实例注入到它们中,但我仍然想知道是否有更优雅的方法可以让委托更自然地融入 EnhancedProducer 类。
interface Producer {
fun produce()
}
class ProducerImpl : Producer {
override fun produce() {
// service.doSomething() how to access service here
println( "ProducerImpl")
}
}
class EnhancedProducer(private val delegate: Producer) : Producer by delegate {
// how to share this with delegate
//private val service = Service()
fun test() {
produce()
}
}
fun main() {
val producer = EnhancedProducer(ProducerImpl())
producer.test()
}
解决方案
我最终想出了一个解决方案,在关键字之后立即初始化 ProducerImpl。奇怪的是,到目前为止我发现的所有示例都只是尝试注入一个实例,而不是在需要委托时提供初始化。也许有人对此有所了解?
interface Producer {
fun produce()
}
class ProducerImpl(val service:Service) : Producer {
override fun produce() {
service.doSomething()
println(item)
}
}
class EnhancedProducer(val service:Service) : Producer by ProducerImpl(service) {
fun test() {
produce()
}
}
fun main() {
val service = Service()
val producer = EnhancedProducer(service)
}
推荐阅读
- url - 如何使用 Google 脚本在 URL 中包含数据
- android - 如何在 MainClass 中显示光标计数(某物)返回
- python-2.7 - 如何使用 Discord.py 重写更改机器人昵称?
- python-3.x - 如何访问散景(图)参数
- javascript - Javascript:从外部设置函数中删除绑定事件处理程序
- java - 我正在尝试通过 Java 代码使用 mulesoft 将文件上传到获取 404 file not found 错误的文件夹
- pandas - 如何调用 geopy.distance 将列添加到数据框?
- c - 我的函数查找输入的每个其他数字的两次数字的总和在 C 中不起作用?
- c# - 实体框架核心将导航属性设置为 null 并包含不起作用
- mobile - 移动网络中的 SCCP 限制