Абстрактный класс Kotlin и абстрактные члены

В этой статье вы узнаете об абстрактном классе и о том, как реализовать его в Kotlin (с помощью примеров).

Как и в Java, abstractключевое слово используется для объявления абстрактных классов в Kotlin. Невозможно создать экземпляр абстрактного класса (нельзя создавать объекты абстрактного класса). Однако вы можете наследовать подклассы от них.

Члены (свойства и методы) абстрактного класса не являются абстрактными, если вы явно не используете abstractключевое слово, чтобы сделать их абстрактными. Возьмем пример:

 абстрактный класс Person (var age: Int = 40 fun displaySSN (ssn: Int) (println ("Мой SSN - $ ssn.")) abstract fun displayJob (description: String))

Вот,

  • создается абстрактный класс Person. Вы не можете создавать объекты класса.
  • класс имеет не абстрактное свойство age и не абстрактный метод displaySSN(). Если вам нужно переопределить эти члены в подклассе, они должны быть помечены openключевым словом.
  • У класса есть абстрактный метод displayJob(). У него нет никакой реализации, и его необходимо переопределить в своих подклассах.

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

Пример: абстрактный класс и метод Kotlin

 abstract class Person(name: String) ( init ( println("My name is $name.") ) fun displaySSN(ssn: Int) ( println("My SSN is $ssn.") ) abstract fun displayJob(description: String) ) class Teacher(name: String): Person(name) ( override fun displayJob(description: String) ( println(description) ) ) fun main(args: Array) ( val jack = Teacher("Jack Smith") jack.displayJob("I'm a mathematics teacher.") jack.displaySSN(23123) )

Когда вы запустите программу, вывод будет:

Меня зовут Джек Смит. Я учитель математики. Мой SSN - 23123.

Здесь класс Teacherявляется производным от абстрактного класса Person.

Создается экземпляр объекта класса Teacher. Мы передали "Jack Smith"в качестве параметра первичный конструктор при его создании. Это выполняет блок инициализатора Personкласса.

Затем displayJob()вызывается метод с использованием объекта jack. Обратите внимание, что displayJob()метод объявлен абстрактным в базовом классе и переопределен в производном классе.

Наконец, displaySSN()метод вызывается с использованием объекта jack. Метод не является абстрактным и объявлен в классе Person (а не объявлен в Teacherклассе).

Рекомендуемая литература: Интерфейсы Kotlin

Интерфейсы Kotlin похожи на абстрактные классы. Однако интерфейсы не могут хранить состояние, тогда как абстрактные классы могут.

Это означает, что интерфейс может иметь свойство, но он должен быть абстрактным или предоставлять реализации средств доступа. Принимая во внимание, что свойство абстрактного класса не обязательно должно быть абстрактным.

Интересные статьи...