Интерфейсы Kotlin (с примерами)

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

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

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

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

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

Как определить интерфейс?

Ключевое слово interfaceиспользуется для определения интерфейсов в Kotlin. Например,

 interface MyInterface (var test: String // абстрактное свойство fun foo () // абстрактный метод fun hello () = "Hello there" // метод с реализацией по умолчанию)

Вот,

  • создан интерфейс MyInterface.
  • интерфейс имеет тест абстрактного свойства и абстрактный метод foo().
  • в интерфейсе также есть неабстрактный метод hello().

Как реализовать интерфейс?

Вот как класс или объект могут реализовать интерфейс:

 interface MyInterface (val test: Int // абстрактное свойство fun foo (): String // абстрактный метод (возвращает String) fun hello () (// метод с реализацией по умолчанию // body (необязательно))) class InterfaceImp: MyInterface (override val test: Int = 25 override fun foo () = "Lol" // другой код) 

Здесь класс InterfaceImp реализует интерфейс MyInterface.

Класс переопределяет абстрактные члены (свойство и foo()метод теста ) интерфейса.

Пример: как работает интерфейс?

 interface MyInterface ( val test: Int fun foo() : String fun hello() ( println("Hello there, pal!") ) ) class InterfaceImp : MyInterface ( override val test: Int = 25 override fun foo() = "Lol" ) fun main(args: Array) ( val obj = InterfaceImp() println("test = $(obj.test)") print("Calling hello(): ") obj.hello() print("Calling and printing foo(): ") println(obj.foo()) )

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

test = 25 Вызов hello (): Привет, приятель! Вызов и печать foo (): Lol

Как упоминалось выше, интерфейс может также иметь свойство, обеспечивающее реализацию средства доступа. Например,

 interface MyInterface ( // property with implementation val prop: Int get() = 23 ) class InterfaceImp : MyInterface ( // class body ) fun main(args: Array) ( val obj = InterfaceImp() println(obj.prop) )

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

 23

Здесь prop не является абстрактным. Однако он действителен внутри интерфейса, поскольку обеспечивает реализацию для средства доступа.

Однако вы не можете сделать что-то подобное val prop: Int = 23внутри интерфейса.

Реализация двух или более интерфейсов в классе

Котлин не допускает истинного множественного наследования. Однако в одном классе можно реализовать два или более интерфейса. Например,

 interface A ( fun callMe() ( println("From interface A") ) ) interface B ( fun callMeToo() ( println("From interface B") ) ) // implements two interfaces A and B class Child: A, B fun main(args: Array) ( val obj = Child() obj.callMe() obj.callMeToo() )

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

 Из интерфейса A Из интерфейса B 

Разрешение конфликтов переопределения (множественный интерфейс)

Предположим, два интерфейса (A и B) имеют неабстрактный метод с тем же именем (скажем, callMe()метод). Вы реализовали эти два интерфейса в классе (скажем, C). Теперь, если вы вызовете callMe()метод с использованием объекта класса C, компилятор выдаст ошибку. Например,

 interface A ( fun callMe() ( println("From interface A") ) ) interface B ( fun callMe() ( println("From interface B") ) ) class Child: A, B fun main(args: Array) ( val obj = Child() obj.callMe() )

Вот ошибка:

 Error:(14, 1) Kotlin: Class 'C' must override public open fun callMe(): Unit defined in A because it inherits multiple interface methods of it

To solve this issue, you need to provide your own implementation. Here's how:

 interface A ( fun callMe() ( println("From interface A") ) ) interface B ( fun callMe() ( println("From interface B") ) ) class C: A, B ( override fun callMe() ( super.callMe() super.callMe() ) ) fun main(args: Array) ( val obj = C() obj.callMe() )

Now when you run the program, the output will be:

 From interface A From interface B

Here, explicit implementation of callMe() method is provided in class C.

 class C: A, B ( override fun callMe() ( super.callMe() super.callMe() ) )

The statement super.callMe() calls the callMe() method of class A. Similarly, super.callMe() calls the callMe() method of class B.

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