我试图将一些工作从一个庞大的类中拆分出来,以提供更高的可读性。首先,我研究了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)
}

08-18 17:41
查看更多