使用参数化函数实现接口

假设我有一个接口

interface A { fun calculate(n: Int): Int } 

我想在类B实现A (比如说),以便在B的构造函数中提供calculation ,如下所示:

 class B (f : (Int) -> Int) : A { override fun calculate(n: Int): Int //...somehow assign f to calculate } 

这可以做到没有B的财产吗?

嗯…这个作品:

 interface A { val calculate: (n: Int) -> Int } class B(f: (Int) -> Int) : A { override val calculate = f } 

有人可以在这里解释funval之间的语法差异吗? 我知道函数定义:fun vs val,但是想得到’语言级别’的理解。

实现这个最简单的方法是:

 class B(val f : (Int) -> Int) : A { override fun calculate(n: Int): Int = f(n) } 

是的,这可以做到没有B的财产。 例如通过使用类委托到一个对象expression式 :

 class B(f: (Int) -> Int) : A by object : A { override fun calculate(n: Int) = f(n) } 

即便如此,一个private val似乎更适合这个简单的例子。