在Kotlin中,抽象函数的默认参数值是继承的吗?

cdmah0mi  于 2023-02-05  发布在  Kotlin
关注(0)|答案(2)|浏览(170)

在Kotlin中,你可以定义一个带有默认值的抽象函数。
这个默认值是否会被传递到实现函数中,而不需要在每个实现中指定相同的默认参数?

xxe27gdn

xxe27gdn1#

不仅没有"需要在每个实现中指定相同的默认参数",甚至是不允许的。
重写方法始终使用与基方法相同的默认参数值。当使用默认参数值重写方法时,必须从签名中省略默认参数值:

open class A {
open fun foo(i: Int = 10) { /*...*/ }
}
class B : A() {
override fun foo(i: Int) { /*...*/ }  // no default value allowed
}

对于评论
我想如果我们希望实现类有不同的默认值,我们要么从父类中省略它,要么在方法内部处理它。
另一个选择是使它成为一个可以覆盖的方法:

interface IParent {
    fun printSomething(argument: String = defaultArgument())
    
    fun defaultArgument(): String = "default"
}

class Child : IParent {
    override fun printSomething(argument: String) {
        println(argument)
    }

    override fun defaultArgument(): String = "child default"
}

Child().printSomething() // prints "child default"
6kkfgxo0

6kkfgxo02#

(It's OK to ask and answer your own questions)
下面的代码确认将默认值传递给实现。

interface IParent {
    fun printSomething(argument: String = "default") // default val specified in interface
}

class Child : IParent {
    override fun printSomething(argument: String){ // no default val specified in impl.
        println(argument)
    }
}

Child().printSomething() // compiles successfully, and prints "default"

相关问题