В тази статия ще научите за интерфейсите и как да го внедрите в Kotlin с помощта на примери.
Котлин интерфейсите са подобни на интерфейсите в Java 8. Те могат да съдържат дефиниции на абстрактни методи, както и внедряване на не абстрактни методи. Те обаче не могат да съдържат никакво състояние.
Значението е, че интерфейсът може да има свойство, но той трябва да е абстрактен или да предоставя реализации на достъп.
Препоръчително четене: Абстрактна класа на Kotlin
Абстрактните класове в Kotlin са подобни на интерфейса с една важна разлика. Не е задължително свойствата на абстрактния клас да бъдат абстрактни или да осигуряват реализации на достъп.
Как да дефинирам интерфейс?
Ключовата дума interface
се използва за дефиниране на интерфейси в Kotlin. Например,
интерфейс MyInterface (var test: String // абстрактно свойство fun foo () // абстрактен метод fun hello () = "Hello there" // метод с изпълнение по подразбиране)
Тук,
- създава се интерфейс MyInterface.
- интерфейсът има тест за абстрактни свойства и абстрактен метод
foo()
. - интерфейсът също има абстрактен метод
hello()
.
Как да приложим интерфейс?
Ето как клас или обект могат да реализират интерфейса:
интерфейс MyInterface (вал тест: Int // абстрактно свойство fun foo (): String // абстрактен метод (връща String) fun hello () (// метод с изпълнение по подразбиране // тяло (по избор))) клас InterfaceImp: MyInterface (замяна 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 Обаждане на здравей (): Здравей, приятелю! Обаждане и отпечатване на 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.
Тук опората не е абстрактна. Въпреки това, той е валиден вътре в интерфейса, защото осигурява изпълнение за достъп.
Не можете обаче да направите нещо като val prop: Int = 23
вътре в интерфейса.
Внедряване на два или повече интерфейса в клас
Kotlin не позволява истинско множествено наследяване. Възможно е обаче да се приложат два или повече интерфейса в един клас. Например,
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() )
Ето грешката:
Грешка: (14, 1) Kotlin: Класът „C“ трябва да замени публичния отворен забавен callMe (): Единицата, дефинирана в A, защото наследява множество методи за интерфейс от нея
За да разрешите този проблем, трябва да предоставите собствено изпълнение. Ето как:
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() )
Сега, когато стартирате програмата, изходът ще бъде:
От интерфейс A От интерфейс B
Тук callMe()
е предвидено изрично изпълнение на метод в клас C.
клас C: A, B (замяна на забавен callMe () (super.callMe () super .callMe ()))
Операторът super.callMe()
извиква callMe()
метода на клас А. По същия начин извиква метода на класа .super.callMe()
callMe()
B