В этой статье вы узнаете об абстрактном классе и о том, как реализовать его в 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 похожи на абстрактные классы. Однако интерфейсы не могут хранить состояние, тогда как абстрактные классы могут.
Это означает, что интерфейс может иметь свойство, но он должен быть абстрактным или предоставлять реализации средств доступа. Принимая во внимание, что свойство абстрактного класса не обязательно должно быть абстрактным.