如何让super.property作为构造函数参数的默认值?

时间:2020-11-10 03:31:34

标签: kotlin

对于界面:

interface Some {
    val p1: String get() = "p1"
    val p2: String get() = "p2"
}

对于班级:

class SomeImpl(
override val p1: String = super.p1
override val p2: String = super.p2
) : Some

错,发生编译错误。我试过如: super.Some.p1Some.super.p1super@Some.p1this@Some.p1,都不正确...

1 个答案:

答案 0 :(得分:0)

在为构造函数参数设置默认值的上下文中未定义

super。它仅在类体内定义。因此,您可以使用以下解决方法:

变量1

使用辅助可为空的构造函数参数:

class SomeImpl(_p1: String? = null, _p2: String? = null) : Some {
    override val p1: String = _p1 ?: super.p1
    override val p2: String = _p2 ?: super.p2
}

用法:

val someImpl0 = SomeImpl()
println("${someImpl0.p1}, ${someImpl0.p2}") //p1, p2
val someImpl1 = SomeImpl("1")
println("${someImpl1.p1}, ${someImpl1.p2}") //1, p2
val someImpl2 = SomeImpl("1", "2")
println("${someImpl2.p1}, ${someImpl2.p2}") //1, 2

变量2

您可以将p1p2接口参数移至伴随对象,因此派生类可以在隐藏它们时将它们用作构造函数中的默认值:

interface Some {
    companion object {
        const val p1 = "p1"
        const val p2 = "p2"
    }
}

class SomeImpl(val p1: String = Some.p1, val p2: String = Some.p2) : Some

用法是相同的。但在这种情况下(与第一个变体不同),如果将属性强制转换为Some,则实例将无法访问这些属性:

val someImpl : Some = SomeImpl()
println("${someImpl.p1}, ${someImpl.p2}") //Will not compile