Kotlin中开放和覆盖方法的区别?

时间:2017-09-25 07:09:13

标签: kotlin

open class Base {

    open fun v() {}

    fun nv() {}
}

class Derived() : Base() {

    override fun v() {}
}

这是一个例子。有人可以解释一下这个区别吗? 这里是否必须打开关键字?

3 个答案:

答案 0 :(得分:26)

是的,您的示例中必须使用open个关键字。

您必须区分open对类和函数的使用。

类:如果要从类继承,则需要类的open关键字。默认情况下,所有类都是final,不能继承。

功能:在功能上,您需要open才能覆盖它。默认情况下,所有函数都是final,您无法覆盖它们。

编辑:因为我在评论中看到了一些混淆。

  

pokemzok:我有一个内部抽象类,我可以在没有任何内容的情况下继承   问题。我也可以随意覆盖抽象方法   宣称它们是开放的

抽象类是继承的,因为您无法实例化它们。事实上,默认情况下,它们不只是open,它们首先不能是finalfinalabstract不兼容。 abstract方法也是如此,它们必须被覆盖!

答案 1 :(得分:2)

  

类上的open注释与Java final相反:它允许其他人继承此类,因为默认情况下Kotlin中的所有类都是final。 [Source]

只有在将某个类声明为open之后,我们才能inherit该类。

如果方法在基类中打开,则该方法只能是overridden。注释override表示通过继承类来覆盖基本方法。

答案 2 :(得分:1)

默认情况下,Kotlin中的函数定义为final。 这意味着你无法覆盖它们。如果您从函数open中移除v(),则会在您的班级Derived中收到错误,即函数v是最终版并且无法覆盖。

使用open标记某个功能时,它不再是final,您可以在派生类中覆盖它。