Interface 通过使用在超类中定义的具有相同名称的var重写接口中定义的val
有一个基本类(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
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 }
}