Разница между открытыми и переопределяющими методами в Котлине?

open class Base { open fun v() {} fun nv() {} } class Derived() : Base() { override fun v() {} } 

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

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


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

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

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


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

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

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

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

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

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

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

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