通过使用在超类中定义的相同名称的var来覆盖接口中定义的val

时间:2017-10-20 16:01:51

标签: interface kotlin subclass superclass

Base 类( var 需要保持受保护):

public static string MapDataTypes(SqlDbType sqlDataType, int size)
{
    switch (sqlDataType)
    {
        case SqlDbType.Int:
            return "INT";
        case SqlDbType.VarChar:
            return "TEXT(" + size + )";
        .....


   }
}

有一个界面需要使用 val

open class Base(protected var id: Int) {}

还有一个类继承自 Base 并实现 ProviderI 接口。我正在尝试使用超类 var (具有相同名称)来实现界面 val 。 作为一个不起作用的例子,我试图做那样的事情(例子不起作用):

interface ProviderI {
    val id: Int
}

这个想法很简单,但我已经尝试了所有内容,并且每次报告不同的错误。

2 个答案:

答案 0 :(得分:3)

要覆盖多个超类型中存在的成员,Kotlin要求所有超类型中的open,并且此限制看起来很自然,因为否则final成员可以很容易地以这种方式覆盖。

解决方案是在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 }
}

答案 1 :(得分:1)

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