execute()
您可以创建execute
属性并在那里保留函数引用,而不是创建函数。然后你可以像使用函数一样使用它:
class FooDelegate {
val execute = Foo::doSomething
}
fun main() {
FooDelegate().execute(Foo(), "hello", "world", true)
}
或者:
class FooDelegate {
private val foo = Foo()
val execute = foo::doSomething
}
fun main() {
FooDelegate().execute("hello", "world", true)
}
您还可以创建一个包装器KFunction
来隐藏其属性,如annotations
、isFinal
等,但保留其operator fun invoke
功能。这将使您更灵活地使用这些功能。它还可以用真正的函数替换execute
属性。execute()
但是,您需要为每个属性数量创建一个单独的包装器。它可能看起来像这样:
fun main() {
delegate(Foo()::doSomething).execute("hello", "world", true)
delegate(Foo::doSomething).execute(Foo(), "hello", "world", true)
}
fun <P0, P1, P2, R> delegate(func: (P0, P1, P2) -> R) = FunctionDelegate3(func)
fun <P0, P1, P2, P3, R> delegate(func: (P0, P1, P2, P3) -> R) = FunctionDelegate4(func)
class FunctionDelegate3<P0, P1, P2, R>(
private val func: (P0, P1, P2) -> R
) {
fun execute(p0: P0, p1: P1, p2: P2): R = func(p0, p1, p2)
}
class FunctionDelegate4<P0, P1, P2, P3, R>(
private val func: (P0, P1, P2, P3) -> R
) {
fun execute(p0: P0, p1: P1, p2: P2, p3: P3): R = func(p0, p1, p2, p3)
}
尽管如此,这听起来还是一件很奇怪的事情。就像您尝试在另一种编程语言中创建编程语言一样。