在Kotlin中重写方法时,必须声明定义方法的基类和方法本身open
。
重写方法后默认派生类final
,而重写方法open
默认。从参考文档:
标记为覆盖的成员本身是开放的,即它可以在子类中被覆盖。如果要禁止重新覆盖,请使用 final。
我想知道为什么Kotlin 团队做出了这个设计决定,而不是将重写的方法也设为 final,这是派生类和每个非重写方法的默认设置。搜索网络时找不到任何提示?
是否有人与此设计决策背后的推理有联系或可能会激发它?
在Kotlin中重写方法时,必须声明定义方法的基类和方法本身open
。
重写方法后默认派生类final
,而重写方法open
默认。从参考文档:
标记为覆盖的成员本身是开放的,即它可以在子类中被覆盖。如果要禁止重新覆盖,请使用 final。
我想知道为什么Kotlin 团队做出了这个设计决定,而不是将重写的方法也设为 final,这是派生类和每个非重写方法的默认设置。搜索网络时找不到任何提示?
是否有人与此设计决策背后的推理有联系或可能会激发它?
它更实用。如果该方法是开放的,则意味着它被设计为被覆盖,并且此类方法通常在类层次结构中被多次覆盖。并且将派生类标记为比对所有重写的方法也open
重复修饰符要容易得多。open
您可能会争辩说这些属性实际上是相关的。如果该类被显式标记为open
,则所有定义为 的属性和方法open
在所有子类中都以相同的方式处理。如果子类未打开,则方法不可覆盖,无论它们自己的修饰符如何。
您可能也注意到了,原始定义的所有修饰符都是继承的。因此,您不必复制该信息,仅当您想更改签名时,您必须明确定义它。