Что нужно сделать, чтобы класс можно было наследовать? (open)



По умолчанию, классы в Kotlin объявляются как final, то есть их нельзя наследовать. Если мы всё же попытаемся наследоваться от такого класса, то получим ошибку: “This type is final, so it cannot be inherited from”.



Чтобы класс можно было наследовать, его нужно объявить с модификатором open.



open class Fraction {

...

}



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



open class Fraction {



open fun toAttack() {

...

}



}



Свойства класса также по умолчанию являются final. Для возможности переопределения таких свойств в дочерних классах, не забудьте и их отметить ключевым словом open.



open class Fraction {



open val name: String = "default"



open fun toAttack() {

...

}



}



При этом, если в открытом классе будут присутствовать функции и свойства, которые не отмечены словом open, то переопределяться они не будут. Но дочерний класс сможет к ним обращаться.



open class Fraction {



open val name: String = "default"



fun toAttack() {

...

}



}



class Horde : Fraction() {

override val name = "Horde"

}



class SomeClass() {

val horde = Horde()

horde.toAttack()

}