Разница между методами 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
аннотация в классе противоположна Javafinal
: Он позволяет другим наследовать от этого класса, так как по умолчанию все классы в Kotlin являютсяfinal
. [источник]
только после объявления класса как open
У нас можете inherit
этого класса.
метод может быть только overridden
если он открыт в базовом классе. Аннотация override
сигнализирует о переопределении базового метода путем наследования класса.
по умолчанию функции в Kotlin определяются как final
.
Это означает, что вы не можете переопределить их. Если убрать open
из функции v()
чем вы получите ошибку в своем классе Derived
функция v
является окончательным и не может быть переопределен.
когда вы отмечаете функцию с open
, не больше final
и вы можете переопределить его в производных классах.