Статьи Kotlin. Ключевое слово open. Наследование
Post
Cancel

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()
}

Полезные ссылки

Официальная документация - наследование.
Неофициальный перевод документации на русский язык - наследование.

This post is licensed under CC BY 4.0 by the author.