Kotlin. Ключевое слово open. Наследование
По умолчанию в Kotlin нельзя унаследовать один класс от другого. Связано это с тем, что всем классам при создании неявно задаётся статус final, который и блокирует возможность наследования. Если мы всё же попытаемся унаследоваться от такого класса, то получим ошибку: “This type is final, so it cannot be inherited from”.
Чтобы этого избежать, нужно сделать класс наследуемым. В этом и поможет ключевое слово open. Отмечаем им нужный класс, после чего он может стать родительским.
1
2
3
open class Fraction {
...
}
Не только классы, но и функции в Kotlin по умолчанию имеют статус final. Поэтому те функции, которые находятся в родительском классе и которые вы хотите переопределить в дочерних классах, также должны быть отмечены ключевым словом open.
1
2
3
4
5
6
7
open class Fraction {
open fun toAttack() {
...
}
}
Неожиданно, но и свойства класса по умолчанию являются final. Для возможности
переопределения таких свойств в дочерних классах, не забудьте и их отметить ключевым словом open.
1
2
3
4
5
6
7
8
9
open class Fraction {
open val name: String = "default"
open fun toAttack() {
...
}
}
При этом, если в открытом классе будут присутствовать функции и свойства, которые не отмечены словом open, то переопределяться они не будут. Но дочерний класс сможет к ним обращаться.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
open class Fraction {
open val name: String = "default"
fun toAttack() {
...
}
}
class Horde : Fraction() {
override val name = "Horde"
}
class SomeClass() {
val horde = Horde()
horde.toAttack()
}
Полезные ссылки
Официальная документация - наследование.
Неофициальный перевод документации на русский язык - наследование.