Я пытаюсь отделить некоторые работы от гигантского класса, чтобы обеспечить большую читабельность. Сначала я посмотрел на Extension, но, похоже, он просто создает некоторые функции stati c, затем мне в глаза попался шаблон делегата.
Приведенный ниже код выглядит хорошо, и делегат работает так, как если бы он был частью класса 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()
}