如果没有作为函数参数传递任何东西,请使用接口的默认实现

时间:2019-11-16 16:41:48

标签: kotlin

在Kotlin中,我有一个默认实现的接口:

  interface MyInterface {
        fun foo() = "foo"
        fun bar() = 120        
    }

因此,我正在尝试创建一个将MyInterface作为参数的函数,或者如果未通过的话,则使用默认实现。
以下内容无法编译:
fun(param1: String, param2: Int, myInterface: MyInteface = MyInterface())

我该如何解决?

3 个答案:

答案 0 :(得分:2)

创建一个实现该接口的类,并使用

class MyDefaultImplementation : MyInterface

fun(param1: String, param2: Int, myInterface: MyInterface = MyDefaultImplementation())

甚至更好的是,创建一个实现此接口的对象(单例),并将该对象用作默认值。

object MyDefaultImplementationObject : MyInterface
fun(param1: String, param2: Int, myInterface: MyInterface = MyDefaultImplementationObject)

答案 1 :(得分:1)

然后默认值必须是一个实现接口的对象...

class MyInterfaceImplementation: MyInterface

fun (param1: String, param2: Int, myInterface: MyInteface = MyInterfaceImplementation()) {
    /* Function implementation */
}

答案 2 :(得分:1)

正如其他答案所说,您需要一个实现您的接口的对象。

也许最简单的创建方法是使用object : <ClassOrInterface>语法:

fun myFun(param1: String, param2: Int, myInterface: MyInterface = object : MyInterface{}) {
    // …
}

这可能会为使用默认*的每个调用创建一个新对象。如果那很重要,您可能要单独创建一个对象:

val defaultImpl = object : MyInterface

fun myFun(param1: String, param2: Int, myInterface: MyInterface = defaultImpl) {
    // …
}

(* Kotlin 1.3.50似乎总是在每次使用默认值时创建一个新实例。但是该行为未在文档中指定,因此有可能在以后的版本中进行优化。 sup>