У овом чланку ћете научити о интерфејсима и како то применити у Котлину уз помоћ примера.
Котлин интерфејси су слични интерфејсима у Јави 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