对于界面:
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.p1
,Some.super.p1
,super@Some.p1
,this@Some.p1
,都不正确...
答案 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
您可以将p1
和p2
接口参数移至伴随对象,因此派生类可以在隐藏它们时将它们用作构造函数中的默认值:
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