Kotlinské rozhrania (s príkladmi)

V tomto článku sa dozviete o rozhraniach a o tom, ako ich implementovať v Kotline pomocou príkladov.

Rozhrania Kotlin sú podobné rozhraniam v Jave 8. Môžu obsahovať definície abstraktných metód, ako aj implementácie iných ako abstraktných metód. Nemôžu však obsahovať žiadny štát.

To znamená, že rozhranie môže mať vlastnosť, ale musí byť abstraktné alebo musí poskytovať implementácie prístupového modulu.

Odporúčame prečítať : Kotlinská abstraktná trieda

Abstraktné triedy v Kotline sú podobné rozhraniu s jedným dôležitým rozdielom. Nie je povinné, aby boli vlastnosti abstraktnej triedy abstraktné alebo aby poskytovali implementácie prístupového objektu.

Ako definovať rozhranie?

Kľúčové slovo interfacesa používa na definovanie rozhraní v Kotline. Napríklad,

 rozhranie MyInterface (var test: String // abstraktná vlastnosť fun foo () // abstraktná metóda fun hello () = "Hello there" // metóda s predvolenou implementáciou)

Tu,

  • vytvorí sa rozhranie MyInterface.
  • rozhranie má test abstraktných vlastností a abstraktnú metódu foo().
  • rozhranie má tiež nie abstraktnú metódu hello().

Ako implementovať rozhranie?

Trieda alebo objekt môže implementovať rozhranie takto:

 interface MyInterface (test valcov: Int // abstraktna vlastnost fun foo (): String // abstraktna metoda (vrati String) fun hello () (// metoda s defaultnou implementaciou // body (volitelne))) class InterfaceImp: MyInterface (override test valcov: Int = 25 prepísať fun foo () = "Lol" // iný kód) 

Trieda InterfaceImp tu implementuje rozhranie MyInterface.

Trieda prepíše abstraktné členy (testovacia vlastnosť a foo()metóda) rozhrania.

Príklad: Ako funguje rozhranie?

 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()) )

Po spustení programu bude výstup:

test = 25 Volám ahoj (): Ahoj, kámo! Volanie a tlač foo (): Lol

Ako už bolo spomenuté vyššie, rozhranie môže mať aj vlastnosť, ktorá poskytuje implementáciu prístupového objektu. Napríklad,

 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) )

Po spustení programu bude výstup:

 23

V tomto prípade nie je rekvizita abstraktná. Je však platná vo vnútri rozhrania, pretože poskytuje implementáciu pre prístupového hráča.

Nemôžete však robiť niečo ako val prop: Int = 23vo vnútri rozhrania.

Implementácia dvoch alebo viacerých rozhraní v triede

Kotlin neumožňuje skutočné viacnásobné dedičstvo. Je však možné implementovať dve alebo viac rozhraní v jednej triede. Napríklad,

 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() )

Po spustení programu bude výstup:

 Z rozhrania A Z rozhrania B 

Riešenie prevažujúcich konfliktov (viacnásobné rozhranie)

Predpokladajme, že dve rozhrania (A a B) majú neabstraktnú metódu s rovnakým názvom (povedzme callMe()metódu). Tieto dve rozhrania ste implementovali do triedy (povedzme C). Teraz, ak zavoláte callMe()metódu pomocou objektu triedy C, kompilátor vyvolá chybu. Napríklad,

 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() )

Tu je chyba:

 Chyba: (14, 1) Kotlin: Trieda „C“ musí prepísať verejné otvorené zábavné volanie Me (): Jednotka definovaná v A, pretože po nej dedí viac metód rozhrania.

Na vyriešenie tohto problému je potrebné zabezpečiť vlastnú implementáciu. Tu je postup:

 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() )

Teraz, keď spustíte program, výstup bude:

 Z rozhrania A Z rozhrania B

Tu callMe()je poskytnutá explicitná implementácia metódy v triede C.

trieda C: A, B (prepísať zábavné callMe () (super.callMe () super .callMe ()))

Príkaz super.callMe()volá callMe()metódu triedy A. Podobne volá metódu triedy .super.callMe()callMe()B

Zaujímavé články...