为什么可以在子类型的重写成员函数中省略默认值?

2024-03-04

正如标题所述:为什么可以在子类型的重写成员函数中省略默认值?

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.

我怀疑这主要是语言设计/可用性决定。从这个角度来看,有四种选择:

  1. 仅在超类型中声明。
  2. 仅在子类型中声明。
  3. 两者都声明,但不允许子类型更改默认值。
  4. 在两者中声明,允许子类型覆盖超类型中的默认值。

Kotlin 设计师选择了选项#1。这是有道理的,因为:

选项 #2 和 #4 都意味着调用者不会知道默认值是什么,除非他们知道他们正在使用哪个实现,这当然是非常不希望的。调用者将需要额外的逻辑来确定是否需要一个值来覆盖默认值,这意味着默认值将毫无用处。

选项 #3 违反了干燥原则 https://en.wikipedia.org/wiki/Don%27t_repeat_yourself。为什么强制声明在两个地方?

这使得选项 1 成为唯一明智的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么可以在子类型的重写成员函数中省略默认值? 的相关文章

随机推荐