通过使用在超类中定义的相同名称的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 } } 
Interesting Posts