通过使用在超类中定义的相同名称的var来覆盖在接口中定义的val
有一个基类( var需要保护):
open class Base(protected var id: Int) {}
有一个需要使用val的接口:
interface ProviderI { val id: Int }
还有一个从Base继承的类实现了ProviderI接口。 其中我试图使用超类var (具有相同的名称)实现接口的val 。 作为一个不工作的例子,我试图做这样的事情(例如不起作用):
class Instance(id: Int): Base(id), ProviderI { override val id get() { return super.id } }
这个想法很简单,但我已经尝试了一切,每次都会报告不同的错误。
为了覆盖多个超类型中存在的成员,Kotlin要求它在所有超类型中都是 open
,这种限制看起来很自然,因为否则final
成员可以通过这种方式轻松地被覆盖。
解决方法是在Base
打开id
,并将其覆盖为var
属性:
open class Base(protected open var id: Int) interface ProviderI { val id: Int } class Instance(id: Int): Base(id), ProviderI { override var id: Int get() = super.id set(value) { super.id = value } }
Kotlin不允许val
属性覆盖var
属性。
最接近的事情,将工作:
open class Base(protected open var id: Int) {} interface ProviderI { val id: Int } class Instance(id: Int): Base(id), ProviderI { override var id: Int = 0 get() { return super.id } }