Разница между методами open и override в Котлине?

open class Base {

    open fun v() {}

    fun nv() {}
}

class Derived() : Base() {

    override fun v() {}
}

Это пример. Кто-нибудь может объяснить разницу? Является ли ключевое слово open обязательным здесь?

3 ответов


да, как open ключевые слова являются обязательными в вашем примере.


вы должны различать использование open о классах и функциях.

класс: вам нужно open ключевое слово для класса, если вы хотите наследовать от него. По умолчанию все классы final и не может быть унаследован от.

функция: на функции вам нужно open чтобы иметь возможность переопределить его. По умолчанию все функции final и вы не можете переопределить их.


Edit: потому что я видел некоторую путаницу в комментариях.

pokemzok: у меня есть внутренний абстрактный класс, который я могу наследовать без каких-либо проблема. Я также могу переопределить его абстрактные методы, как мне нравится без объявляя их открытыми

абстрактные классы должны быть унаследованы, потому что вы не можете создать их экземпляр. на самом деле они не просто open по умолчанию, они не могут быть final в первую очередь. final и abstract не совместимы. То же самое касается abstract методы, они должны быть overriden!


The open аннотация в классе противоположна Java final: Он позволяет другим наследовать от этого класса, так как по умолчанию все классы в Kotlin являются final. [источник]

только после объявления класса как open У нас можете inherit этого класса.

метод может быть только overridden если он открыт в базовом классе. Аннотация override сигнализирует о переопределении базового метода путем наследования класса.


по умолчанию функции в Kotlin определяются как final. Это означает, что вы не можете переопределить их. Если убрать open из функции v() чем вы получите ошибку в своем классе Derived функция v является окончательным и не может быть переопределен.

когда вы отмечаете функцию с open, не больше final и вы можете переопределить его в производных классах.