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 interface
se 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 = 23
znotraj 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