Kotlin中打开和覆盖方法的区别?
open class Base { open fun v() {} fun nv() {} } class Derived() : Base() { override fun v() {} }
这是一个例子。 有人能解释一下这个区别吗? 打开关键字是强制性的吗?
是的,在你的例子中,这两个open
关键字是强制性
你必须区分open
类和函数的使用。
类:如果你想从它继承,你需要一个类的open
关键字。 默认情况下,所有的类都是final
,不能被继承。
功能:在需要open
的功能上,可以覆盖它。 默认情况下,所有功能都是final
,你不能覆盖它们。
编辑:因为我在评论中看到了一些混乱。
pokemzok :我有一个内部的抽象类,我可以继承没有任何问题。 我也可以按照我的意愿重写它的抽象方法,而不必声明它们是公开的
抽象类意味着被继承,因为你不能实例化它们。 事实上,他们不仅仅是默认open
,他们不可能是final
的。 final
和abstract
不兼容。 abstract
方法也是一样,必须重写!
类的
open
注释与Java的final
一个是相反的:它允许其他人从这个类继承,因为默认情况下Kotlin中的所有类都是final
。 [ 来源 ]
只有在宣布一个类为open
我们才能inherit
该类。
只有在基类中打开的方法才能被overridden
。 注释override
通过继承类来指示基本方法的重写。
默认情况下,Kotlin中的函数被定义为final
。 这意味着你不能重写它们。 如果你从你的函数v()
移除了open
的函数,那么你的类中将会出现一个错误。 Derived
函数v
是final的,不能被覆盖。
当你open
一个函数时,它不再是final
,你可以在派生类中覆盖它。