Selles artiklis saate näidete abil teada liideste kohta ja kuidas seda Kotlinis rakendada.
Kotlini liidesed sarnanevad Java 8 liidestega. Need võivad sisaldada nii abstraktsete meetodite määratlusi kui ka mittebstraktsete meetodite rakendusi. Kuid need ei saa sisaldada ühtegi riiki.
See tähendab, et liidesel võib olla omadus, kuid see peab olema abstraktne või pakkuma juurdepääsurakendusi.
Soovitatav lugemine: Kotlini abstraktne tund
Kotlini abstraktsed klassid sarnanevad liidesega ühe olulise erinevusega. Abstraktse klassi omaduste abstraktsus või juurdepääsurakenduste pakkumine pole kohustuslik.
Kuidas liidest määratleda?
Märksõna interface
kasutatakse Kotlini liideste määratlemiseks. Näiteks,
liides MyInterface (var test: String // abstraktne omadus fun foo () // abstraktne meetod fun tere () = "Tere seal" // meetod vaikerakendusega)
Siin,
- luuakse liides MyInterface.
- liidesel on abstraktse omaduste test ja abstraktne meetod
foo()
. - liidesel on ka mitte-abstraktne meetod
hello()
.
Kuidas liidest rakendada?
Klass või objekt saab liidese rakendada järgmiselt.
liides MyInterface (val test: Int // abstraktne omadus fun foo (): String // abstraktne meetod (tagastab stringi) fun hello () (// meetod vaikerakendusega // body (valikuline))) klass InterfaceImp: MyInterface (alistamine val test: Int = 25 alistab fun foo () = "Lol" // muu kood)
Siin rakendab klassi InterfaceImp MyInterface'i liidest.
Klass tühistab foo()
liidese abstraktsed liikmed (testi omadus ja meetod).
Näide: kuidas liides töötab?
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()) )
Programmi käivitamisel on väljund järgmine:
test = 25 Helistamine tere (): Tere, pal! Foo helistamine ja printimine (): Lol
Nagu ülalpool mainitud, võib liidesel olla ka omadus, mis tagab juurdepääsuprogrammi rakendamise. Näiteks,
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) )
Programmi käivitamisel on väljund järgmine:
23
Siin pole rekvisiit abstraktne. Kuid see kehtib liidese sees, kuna see pakub juurutajale rakendust.
Siiski ei saa te midagi sellist teha nagu val prop: Int = 23
liidese sees.
Kahe või enama liidese rakendamine klassis
Kotlin ei luba tõelist mitmekordset pärimist. Siiski on ühes klassis võimalik rakendada kahte või enamat liidest. Näiteks,
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() )
Programmi käivitamisel on väljund järgmine:
Liideselt A Liideselt B
Ülekaalukate konfliktide lahendamine (mitu liidest)
Oletame, et kahel liidesel (A ja B) on sama nimega mitte-abstraktne meetod (oletame, et callMe()
meetod). Te rakendasite need kaks liidest klassis (oletame, et C). Kui nüüd helistate callMe()
meetodile C-klassi objekti abil, viskab kompilaator vea. Näiteks,
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() )
Siin on viga:
Viga: (14, 1) Kotlin: Klass C peab alistama avaliku avatud lõbusa kõne
Selle probleemi lahendamiseks peate pakkuma oma rakenduse. Nii toimige järgmiselt.
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() )
Nüüd, kui programmi käivitate, on väljund järgmine:
Liideselt A Liideselt B
Siin on callMe()
meetodi selgesõnaline rakendamine esitatud klassis C.
klass C: A, B (alista lõbus callMe () (super.callMe () super .callMe ()))
Avaldus super.callMe()
kutsub callMe()
klassi A meetodit. Samamoodi kutsub klassi meetodit .super.callMe()
callMe()
B