在覆盖 Kotlin 中的方法时,定义该方法的基类和方法本身必须声明为open
。
在重写方法之后,派生类默认为final
,而重写方法默认为open
。从参考文档中:
标记为override的成员本身是开放的,即它可以在子类中被覆盖。如果要禁止重新覆盖,请使用final。
我想知道为什么 Kotlin-Team 做出此设计决策,而不是使覆盖的方法也最终确定,这是派生类和每个非覆盖方法的默认设置。搜索网络时找不到任何提示?
有人可以链接到此设计决策的背后原因吗?还是可以激发它的动力?
答案 0 :(得分:2)
实用得多。如果该方法是开放的,则意味着它被设计为被覆盖,并且此类方法通常在类层次结构中被多次覆盖。并且将派生类标记为open
比对所有重写方法都重复open
修饰符要容易得多。
答案 1 :(得分:1)
您可能会说这些属性实际上是相关的。如果该类被显式标记为open
,则在所有子类中以相同的方式对待所有定义为open
的属性和方法。如果子类未打开,则方法是不可重写的,而不管它们自己的修饰符是什么。
您可能还已经注意到,原始定义的所有修饰符都是继承的。因此,您不必重复该信息,仅当您要更改签名时,才需要显式定义它。