Внедрение интерфейса с параметризованной функцией

Предположим, у меня есть интерфейс

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

Я бы хотел реализовать A в классе B (скажем), чтобы calculation предоставлено в конструкторе B , что-то вроде:

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

Можно ли это сделать, не превращая f в свойство B ?

Хм … это работает:

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

Может ли кто-нибудь объяснить предполагаемую синтаксическую разницу между fun и val здесь? Я знаю определение функции: fun vs val, но хотел бы получить понимание «уровня языка».

Самый простой способ реализовать это:

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

Да, это можно сделать, не превращая f в свойство B например, с помощью делегирования класса в выражение объекта :

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

Тем не менее, private val пример кажется более подходящим для этого простого примера.