我试图将一些工作从一个庞大的类中拆分出来,以提供更高的可读性。首先,我研究了Extension,但似乎只是在创建一些静态函数,然后我就看到了委托(delegate)模式。
下面的代码看起来没问题,并且委托(delegate)就像是EnhancedProducer类的一部分一样工作。
但是,有一个问题使我受阻,但我不太了解如何从委托(delegate)那里访问EnhancedProcuder类的service属性。在我的实际代码中,有时原始类和委托(delegate)类都需要同时使用service变量,因此我不知道是否有办法。
我确实知道我们可以将服务实例注入(inject)到它们两者中,但是我仍然想找出是否存在一种更优雅的方法来使委托(delegate)更自然地适合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。太奇怪了,到目前为止,我发现的所有示例都只尝试注入(inject)实例,而不在需要委托(delegate)时提供初始化。也许有人对此有所了解?
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)
}