类C(val field:T):T by field是什么意思?

时间:2020-04-12 06:23:42

标签: kotlin

我最近遇到the following class declaration

class C(val field: T): T by field

其中T是接口。

这种技术叫什么?

此声明的作用是什么?

2 个答案:

答案 0 :(得分:9)

这称为delegation,具体地说,它是一种称为委托实现的委托类型。

这样做,类C使用另一个对象实现了接口。

即当您调用接口中定义的方法(函数)时,该调用将转移到您委托的对象中,即field

interface T {
    fun print()
}
class TImpl: T {
    override fun print() = print("Hello World!")
}

class C(val field: T) : T by field {...}

fun main() {
    val c = C(TImpl())
    c.print()                 //Prints: Hello World!
}

由于类C通过使用字段实现T,因此print()调用被转移到TImpl

答案 1 :(得分:2)

此语法是kotlin语言提供的快捷方式,它表示C实现T并将所有T方法实现委托给conv_handler = ConversationHandler( entry_points=[CommandHandler('start', start)], states={ CHOOSING: [MessageHandler(Filters.regex('^(Age|Favourite colour|Number of siblings)$'), regular_choice), MessageHandler(Filters.regex('^Something else...$'), custom_choice) ], TYPING_CHOICE: [MessageHandler(Filters.text, regular_choice) ], TYPING_REPLY: [MessageHandler(Filters.text, received_information), ], ConversationHandler.TIMEOUT: [MessageHandler(Filters.text | Filters.command, timeout)], }, fallbacks=[MessageHandler(Filters.regex('^Done$'), done)], conversation_timeout=60 def timeout(update, context): update.message.reply_text('timeout reached, hope to see you next time',reply_markup=ReplyKeyboardRemove()) 成员。

在Java或其他OO语言中,您可以通过在C中声明每个T方法并调用field.theMethod中的每个方法(也称为无价值样板代码)来实现相同目的

Kotlin在生成的Java字节码中为您完成此操作。