重写方法的 open 修饰符背后的推理

Reasoning behind open modifier for overriden methods

Kotlin 中覆盖方法时,必须声明定义方法的基础 class 和方法本身 open.

覆盖方法后,派生的 class 默认为 final,而覆盖的方法默认为 open。来自参考文档:

A member marked override is itself open, i.e. it may be overridden in subclasses. If you want to prohibit re-overriding, use final.

我想知道为什么 Kotlin-Team 做出了这个设计决定,而不是将重写的方法也设为 final,这是派生的 class 和每个方法的默认值非覆盖方法。我在网上搜索时找不到任何提示?

有没有人link知道这个设计决定背后的原因或者可能会激发它?

只是实用多了。如果该方法是开放的,则意味着它被设计为被覆盖,并且此类方法通常在 class 层次结构中被多次覆盖。并且将派生的 class 标记为 open 比对所有重写方法重复 open 修饰符要容易得多。

您可能会争辩说这些属性实际上是相关的。如果 class 被显式标记为 open,则所有定义为 open 的属性和方法在所有子 class 中都以相同的方式处理。如果 subclass 没有打开,则方法不可重写,不管它们自己的修饰符如何。

您可能也已经注意到,原始定义的所有修饰符都被继承。所以您不必复制该信息,只有当您想要更改签名时,您才必须明确定义它。