首页 > 解决方案 > 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()
}

标签: kotlindelegates

解决方案


我最终想出了一个解决方案,在关键字之后立即初始化 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)
}

推荐阅读