open class Base {
open fun v() {}
fun nv() {}
}
class Derived() : Base() {
override fun v() {}
}
这是一个例子。有人可以解释一下这个区别吗? 这里是否必须打开关键字?
答案 0 :(得分:26)
是的,您的示例中必须使用open
个关键字。
您必须区分open
对类和函数的使用。
类:如果要从类继承,则需要类的open
关键字。默认情况下,所有类都是final
,不能继承。
功能:在功能上,您需要open
才能覆盖它。默认情况下,所有函数都是final
,您无法覆盖它们。
编辑:因为我在评论中看到了一些混淆。
pokemzok:我有一个内部抽象类,我可以在没有任何内容的情况下继承 问题。我也可以随意覆盖抽象方法 宣称它们是开放的
抽象类是继承的,因为您无法实例化它们。事实上,默认情况下,它们不只是open
,它们首先不能是final
。 final
和abstract
不兼容。 abstract
方法也是如此,它们必须被覆盖!
答案 1 :(得分:2)
类上的
open
注释与Javafinal
相反:它允许其他人继承此类,因为默认情况下Kotlin中的所有类都是final
。 [Source]
只有在将某个类声明为open
之后,我们才能inherit
该类。
如果方法在基类中打开,则该方法只能是overridden
。注释override
表示通过继承类来覆盖基本方法。
答案 2 :(得分:1)
默认情况下,Kotlin中的函数定义为final
。
这意味着你无法覆盖它们。如果您从函数open
中移除v()
,则会在您的班级Derived
中收到错误,即函数v
是最终版并且无法覆盖。
使用open
标记某个功能时,它不再是final
,您可以在派生类中覆盖它。