Val-属性 无法覆盖 var-属性

Val-property cannot override var-property

我认为 var 可以被唯一的 getter 覆盖为 val,因为它同时具有 getter 和 setter。但这是不可能的。

并且,如果将只有 getter 的 val 替换为具有 setter 的 var,则不会发生错误。我不知道这怎么可能。

为什么会这样?

因为客户端 类 将尝试与 Main 进行交互,就好像它是一个测试一样。这就是让 Test 开放的意义所在,这样客户将与其子项交互,并期望这些子项的行为像 Test 一样,并接受所有相同的方法调用和变量重新分配。

如果 Test 与其所有客户用户签订合同,允许他们更改 a,那么如果 Main 使 a 不可更改,则违反该合同。

首先,您可以用 var 覆盖 val 的原因是它相当于添加一个 setter,而在超类中只有一个 getter。这在实现某些模式时相当重要。

其次,如果你打开一个变量,这意味着你想让它在子类中可变。不要忘记 val 意味着 只读 不是不可变的。如果你想保持 setter 私有,当你覆盖

时你仍然可以
override var a = 1
    private set

您的第二个示例(用 var 覆盖 val)类似于此伪代码:

open class Test {
    fun getA()
}

class Main : Test() {
    fun setA()
}

Main子类只是增加了一个新的方法,没有理由不可以。您的第一个示例(用 val 覆盖 var)类似于:

open class Test {
    fun getA()
    fun setA()
}

class Main : Test() {
    // remove setA() function
}

您可能知道,无法删除子类中的方法,因此无法用 val.

覆盖 var