Котлин интерфејси (са примерима)

У овом чланку ћете научити о интерфејсима и како то применити у Котлину уз помоћ примера.

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

Занимљиви Чланци...