Šiame straipsnyje su pavyzdžiais sužinosite apie sąsajas ir kaip jas įdiegti Kotline.
„Kotlin“ sąsajos yra panašios į „Java 8“ sąsajas. Jose gali būti abstrakčių metodų apibrėžimai, taip pat ne abstrakčių metodų įgyvendinimai. Tačiau jose negali būti jokios valstybės.
Reiškia, sąsaja gali turėti savybę, tačiau ji turi būti abstrakti arba turi suteikti prieigą.
Rekomenduojama literatūra: Kotlino santrauka
Abstraktios klasės Kotline yra panašios į sąsają su vienu svarbiu skirtumu. Nebūtina, kad abstrakčios klasės ypatybės būtų abstrakčios ar suteiktų prieigą.
Kaip apibrėžti sąsają?
Raktinis žodis interface
naudojamas sąsajoms apibrėžti Kotlin. Pavyzdžiui,
sąsaja „MyInterface“ (var testas: String // abstrakčios nuosavybės linksmybės foo () // abstraktus metodas įdomus labas () = "Sveiki!" // metodas su numatytuoju įgyvendinimu)
Čia
- sukuriama sąsaja „MyInterface“.
- sąsajoje yra abstrakčių savybių testas ir abstraktus metodas
foo()
. - sąsajoje taip pat yra ne abstraktus metodas
hello()
.
Kaip įdiegti sąsają?
Štai kaip klasė ar objektas gali įdiegti sąsają:
sąsaja „MyInterface“ (val testas: Int // abstrakčios nuosavybės linksmybės foo (): String // abstraktus metodas (grąžina eilutę) fun hello () (// metodas su numatytuoju įgyvendinimu // body (pasirinktinai))) klasės „InterfaceImp“: „MyInterface“ (nepaisyti val testas: Int = 25 nepaiso linksmo foo () = "Lol" // kitas kodas)
Čia klasės „InterfaceImp“ įgyvendina „MyInterface“ sąsają.
Klasė nepaiso abstrakčių foo()
sąsajos narių (testo ypatybės ir metodo).
Pavyzdys: Kaip veikia sąsaja?
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()) )
Kai paleisite programą, išvestis bus:
testas = 25 Skambina sveiki (): Sveiki, drauge! Skambinimas ir spausdinimas foo (): Lol
Kaip minėta pirmiau, sąsaja taip pat gali turėti ypatybę, kuri suteikia prieigos prieigą. Pavyzdžiui,
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) )
Kai paleisite programą, išvestis bus:
23
Čia atrama nėra abstrakti. Tačiau jis galioja sąsajoje, nes suteikia prieigai prieigą.
Tačiau jūs negalite padaryti kažko panašaus val prop: Int = 23
į sąsają.
Dviejų ar daugiau sąsajų diegimas klasėje
Kotlinas neleidžia tikro daugkartinio paveldėjimo. Tačiau vienoje klasėje galima įdiegti dvi ar daugiau sąsajų. Pavyzdžiui,
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() )
Kai paleisite programą, išvestis bus:
Iš sąsajos A Iš sąsajos B
Svarbiausių konfliktų sprendimas (daugialypė sąsaja)
Tarkime, dvi sąsajos (A ir B) turi ne abstrakčią metodą tuo pačiu pavadinimu (tarkime, callMe()
metodas). Jūs įdiegėte šias dvi sąsajas klasėje (tarkime, C). Dabar, jei iškviečiate callMe()
metodą naudodami C klasės objektą, kompiliatorius išmes klaidą. Pavyzdžiui,
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() )
Štai klaida:
Klaida: (14, 1) Kotlin: „C“ klasė turi nepaisyti viešo atviro linksmo skambučio „Me“ (): vienetas, apibrėžtas A, nes jis paveldi kelis jo sąsajos metodus
Norėdami išspręsti šią problemą, turite pateikti savo diegimą. Štai kaip:
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() )
Dabar, kai paleisite programą, išvestis bus:
Iš sąsajos A Iš sąsajos B
Čia aiškus callMe()
metodo įgyvendinimas pateiktas C klasėje.
C klasė: A, B (nepaisyti linksmo callMe () (super.callMe () super .callMe ()))
Pareiškime super.callMe()
vadinamas callMe()
A klasės metodas. Panašiai vadinamas klasės metodu .super.callMe()
callMe()
B