Interface 通过使用在超类中定义的具有相同名称的var重写接口中定义的val

Interface 通过使用在超类中定义的具有相同名称的var重写接口中定义的val,interface,kotlin,subclass,superclass,Interface,Kotlin,Subclass,Superclass,有一个基本类(var需要保持保护): 有一个界面需要使用val: interface ProviderI { val id: Int } 还有一个类继承自Base,并实现ProviderI接口。在其中,我尝试使用超类var(具有相同名称)实现接口的val。 作为一个不起作用的例子,我正在尝试这样做(这个例子不起作用): 想法很简单,但我已经尝试了所有方法,每次报告不同的错误。Kotlin不允许val属性覆盖var属性 最有效的方法是: open class Base(protected

有一个基本类(var需要保持保护):

有一个界面需要使用val

interface ProviderI {
    val id: Int
}
还有一个类继承自Base,并实现ProviderI接口。在其中,我尝试使用超类var(具有相同名称)实现接口的val。 作为一个不起作用的例子,我正在尝试这样做(这个例子不起作用):


想法很简单,但我已经尝试了所有方法,每次报告不同的错误。

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 }
}

要覆盖存在于多个超类型中的成员,Kotlin要求它在所有超类型中都是
打开的
,这种限制看起来很自然,因为否则
最终的
成员可以很容易地以这种方式被覆盖

解决方案是使
id
也在
Base
中打开,并将其作为
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 }
}

你的基类可以是抽象的吗?而且,你为什么要这样做还不是很清楚。看起来太复杂了。@dillius,这个类不能是抽象的,我不能修改它。它一点也不复杂,我有一个类已经在comapany的框架中实现了,让我们假设它是基础。我还有客户端的接口,假设它是ProviderI。所以问题是真的,我只是想知道如何解决它。@dillius出于好奇(这不是我在这里可以使用的情况,但仍然很好奇),如果基础是抽象的。它会改变什么?没什么大不了的。如果可以编辑的话,它只是为您提供了如何在基类本身中指定ID属性的其他选项。不幸的是,我无法修改基类。要点是找到在不修改基类的情况下实现接口的方法。虽然您的解决方案与我期望的非常接近。正如我在回复@dillius答案时所写,我无法修改基类。我只是在寻找实现接口的方法。如果不能修改基类,就没有合理的方法再次使用相同的属性名。您能更改接口上的属性名吗?@ DyLuUS,我也不能修改接口,只有中间的类是我的。基类是我公司的框架类,广泛应用于不同的地方。接口是我们客户的代码,也不能修改,因为它现在是我们的。
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 }
}
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 }
}