Kotlinovi vmesniki (z primeri)

V tem članku boste s pomočjo primerov izvedeli več o vmesnikih in kako jih uporabiti v Kotlinu.

Kotlinovi vmesniki so podobni vmesnikom v Javi 8. Lahko vsebujejo definicije abstraktnih metod in izvedbe ne abstraktnih metod. Vendar ne morejo vsebovati nobenega stanja.

To pomeni, da ima vmesnik lastnost, vendar mora biti abstrakten ali pa mora zagotavljati izvedbe dostopnikov.

Priporočeno branje: Povzetek razreda Kotlin

Abstraktni razredi v Kotlinu so podobni vmesnikom z eno pomembno razliko. Za lastnosti abstraktnega razreda ni obvezno, da so abstraktne ali zagotavljajo izvedbe dostopnikov.

Kako definirati vmesnik?

Ključna beseda interfacese uporablja za definiranje vmesnikov v Kotlinu. Na primer

 vmesnik MyInterface (var test: String // abstraktna lastnost fun foo () // abstraktna metoda fun hello () = "Hello there" // metoda s privzeto izvedbo)

Tukaj,

  • ustvarjen je vmesnik MyInterface.
  • vmesnik ima test abstraktnih lastnosti in abstraktno metodo foo().
  • vmesnik ima tudi abstraktno metodo hello().

Kako implementirati vmesnik?

Razred ali predmet lahko implementira vmesnik:

 vmesnik MyInterface (val test: Int // abstraktna lastnost fun foo (): String // abstraktna metoda (vrne String) fun hello () (// metoda s privzeto izvedbo // telo (neobvezno))) razred InterfaceImp: MyInterface (preglasitev test testa: Int = 25 preglasi zabavno foo () = "Lol" // druga koda) 

Tukaj razred InterfaceImp izvaja vmesnik MyInterface.

Razred preglasi abstraktne člane (testna lastnost in foo()metoda) vmesnika.

Primer: Kako deluje vmesnik?

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

Ko zaženete program, bo rezultat:

test = 25 Klicanje zdravo (): Pozdravljeni, kolega! Klicanje in tiskanje foo (): Lol

Kot je bilo omenjeno zgoraj, ima lahko vmesnik tudi lastnost, ki zagotavlja izvedbo dostopa. Na primer

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

Ko zaženete program, bo rezultat:

 23.

Tu prop ni abstrakten. Velja pa znotraj vmesnika, ker zagotavlja izvajanje za dostop.

Vendar ne morete storiti nečesa, kot je val prop: Int = 23znotraj vmesnika.

Implementacija dveh ali več vmesnikov v razredu

Kotlin ne dovoljuje resnične večkratne dediščine. Vendar je mogoče v enem razredu implementirati dva ali več vmesnikov. Na primer

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

Ko zaženete program, bo rezultat:

 Iz vmesnika A Iz vmesnika B 

Reševanje prevladujočih konfliktov (več vmesnikov)

Recimo, da imata dva vmesnika (A in B) neabstraktno metodo z istim imenom (recimo callMe()metoda). Ta dva vmesnika ste implementirali v razred (recimo C). Če pokličete callMe()metodo z uporabo predmeta razreda C, bo prevajalnik vrgel napako. Na primer

 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 napaka:

 Napaka: (14, 1) Kotlin: Razred 'C' mora preglasiti javni odprti zabavni klicMe (): Enota, definirana v A, ker podeduje več njenih vmesniških metod

Če želite rešiti to težavo, morate zagotoviti lastno izvedbo. Takole:

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

Zdaj, ko zaženete program, bo rezultat:

 Iz vmesnika A Iz vmesnika B

Tu je izrecna izvedba callMe()metode predvidena v razredu C.

razred C: A, B (preglasite zabaven callMe () (super.callMe () super .callMe ()))

Stavek super.callMe()pokliče callMe()metodo razreda A. Podobno pokliče tudi metodo razreda .super.callMe()callMe()B

Zanimive Članki...