正如标题所述:为什么可以在子类型的重写成员函数中省略默认值?
Is this normal或预期?
interface Foo {
fun bar(parameter: Int = 1)
}
class Baz : Foo {
override fun bar(parameter: Int) { // OK
println(parameter)
}
}
val baz = Baz()
baz.bar() // OK
baz.bar(2) // OK
在这种情况下同样的行为Foo
是一个类。
这是正常现象还是可以预料的?
Yes.
我怀疑这主要是语言设计/可用性决定。从这个角度来看,有四种选择:
- 仅在超类型中声明。
- 仅在子类型中声明。
- 两者都声明,但不允许子类型更改默认值。
- 在两者中声明,允许子类型覆盖超类型中的默认值。
Kotlin 设计师选择了选项#1。这是有道理的,因为:
选项 #2 和 #4 都意味着调用者不会知道默认值是什么,除非他们知道他们正在使用哪个实现,这当然是非常不希望的。调用者将需要额外的逻辑来确定是否需要一个值来覆盖默认值,这意味着默认值将毫无用处。
选项 #3 违反了干燥原则 https://en.wikipedia.org/wiki/Don%27t_repeat_yourself。为什么强制声明在两个地方?
这使得选项 1 成为唯一明智的选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)