У овом чланку ћете научити о интерфејсима и како то применити у Котлину уз помоћ примера.
Котлин интерфејси су слични интерфејсима у Јави 8. Они могу садржати дефиниције апстрактних метода као и имплементације неастрактних метода. Међутим, они не могу садржати ниједну државу.
Значи, интерфејс може имати својство, али мора бити апстрактно или мора да обезбеди имплементације приступа.
Препоручена литература: Сажетак класе Котлин
Апстрактне класе у Котлину сличне су интерфејсу са једном важном разликом. Није обавезно да својства апстрактне класе буду апстрактна или пружају имплементације приступа.
Како дефинисати интерфејс?
Кључна реч interfaceсе користи за дефинисање интерфејса у Котлину. На пример,
интерфејс МиИнтерфаце (вар тест: Стринг // апстрактно својство фун фоо () // апстрактна метода фун хелло () = "Хелло тхере" // метода са подразумеваном имплементацијом)
Ево,
- креира се интерфејс МиИнтерфаце.
- интерфејс има тест апстрактних својстава и апстрактну методу
foo(). - интерфејс такође има не апстрактну методу
hello().
Како имплементирати интерфејс?
Ево како класа или објекат могу да имплементирају интерфејс:
интерфејс МиИнтерфаце (вал тест: Инт // апстрактно својство фун фоо (): Стринг // абстрактна метода (враћа Стринг) фун хелло () (// метода са подразумеваном имплементацијом // тело (опционално))) класа ИнтерфацеИмп: МиИнтерфаце (оверриде тест теста: Инт = 25 заменити забавну фоо () = "Лол" // други код)
Овде класа ИнтерфацеИмп имплементира интерфејс МиИнтерфаце.
Класа замењује апстрактне чланове (својство и 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()) )
Када покренете програм, излаз ће бити:
тест = 25 Позивање здраво (): Здраво, пријатељу! Позивање и штампање фоо (): Лол
Као што је горе поменуто, интерфејс такође може имати својство које пружа имплементацију приступа. На пример,
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интерфејса.
Имплементација два или више интерфејса у класи
Котлин не дозвољава истинско вишеструко наслеђивање. Међутим, могуће је применити два или више интерфејса у једној класи. На пример,
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() )
Када покренете програм, излаз ће бити:
Из интерфејса А Са интерфејса Б.
Рјешавање превладавајућих сукоба (вишеструки интерфејс)
Претпоставимо да два интерфејса (А и Б) имају апстрактну методу са истим именом (рецимо callMe()методу). Ова два интерфејса сте применили у класи (рецимо Ц). Сада, ако callMe()методу позовете помоћу објекта класе Ц, компајлер ће избацити грешку. На пример,
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) Котлин: Класа 'Ц' мора надјачати јавни отворени забавни позивМе (): Јединица дефинисана у А јер наслеђује вишеструке методе њеног интерфејса
Да бисте решили овај проблем, морате обезбедити сопствену примену. Ево како:
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() )
Сада када покренете програм, излаз ће бити:
Из интерфејса А Са интерфејса Б.
Овде callMe()је предвиђена експлицитна примена методе у класи Ц.
класа Ц: А, Б (надјачати забавни цаллМе () (супер.цаллМе () супер .цаллМе ()))
Изјава super.callMe()позива callMe()метод класе А. Слично томе, позива метод класе .super.callMe()callMe()B








