覆盖方法的open修饰符背后的推理

时间:2018-12-03 09:45:36

标签: kotlin method-modifier

在覆盖 Kotlin 中的方法时,定义该方法的基类和方法本身必须声明为open

在重写方法之后,派生类默认为final,而重写方法默认为open。从参考文档中:

  

标记为override的成员本身是开放的,即它可以在子类中被覆盖。如果要禁止重新覆盖,请使用final。

我想知道为什么 Kotlin-Team 做出此设计决策,而不是使覆盖的方法也最终确定,这是派生类和每个非覆盖方法的默认设置。搜索网络时找不到任何提示?

有人可以链接到此设计决策的背后原因吗?还是可以激发它的动力?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可能会说这些属性实际上是相关的。如果该类被显式标记为open,则在所有子类中以相同的方式对待所有定义为open的属性和方法。如果子类未打开,则方法是不可重写的,而不管它们自己的修饰符是什么。

您可能还已经注意到,原始定义的所有修饰符都是继承的。因此,您不必重复该信息,仅当您要更改签名时,才需要显式定义它。