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
我认为 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