I denne artikel lærer du om grænseflader, og hvordan du implementerer det i Kotlin ved hjælp af eksempler.
Kotlin-grænseflader svarer til grænseflader i Java 8. De kan indeholde definitioner af abstrakte metoder såvel som implementeringer af ikke-abstrakte metoder. De kan dog ikke indeholde nogen tilstand.
Betydning, interface kan have egenskab, men det skal være abstrakt eller skal give accessorimplementeringer.
Anbefalet læsning: Kotlin abstrakt klasse
Abstrakte klasser i Kotlin svarer til grænsefladen med en vigtig forskel. Det er ikke obligatorisk for egenskaber i en abstrakt klasse at være abstrakte eller give accessorimplementeringer.
Hvordan defineres en grænseflade?
Nøgleord interface
bruges til at definere grænseflader i Kotlin. For eksempel,
interface MyInterface (var test: String // abstrakt ejendom sjov foo () // abstrakt metode sjov hej () = "Hej der" // metode med standardimplementering)
Her,
- et interface MyInterface oprettes.
- grænsefladen har en abstrakt egenskabstest og en abstrakt metode
foo()
. - grænsefladen har også en ikke-abstrakt metode
hello()
.
Hvordan implementeres interface?
Her er hvordan en klasse eller et objekt kan implementere grænsefladen:
interface MyInterface (val test: Int // abstrakt egenskab fun foo (): String // abstrakt metode (returnerer String) sjov hej () (// metode med standardimplementering // body (valgfri))) klasse InterfaceImp: MyInterface (tilsidesættelse val test: Int = 25 tilsidesætte fun foo () = "Lol" // anden kode)
Her implementerer en klasse InterfaceImp MyInterface-grænsefladen.
Klassen tilsidesætter abstrakte medlemmer (testegenskaber og foo()
metode) af grænsefladen.
Eksempel: Hvordan fungerer interface?
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()) )
Når du kører programmet, vil output være:
test = 25 Ringer hej (): Hej der, ven! Opkald og udskrivning foo (): Lol
Som nævnt ovenfor kan en grænseflade også have en egenskab, der giver implementering af accessor. For eksempel,
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) )
Når du kører programmet, vil output være:
23
Her er prop ikke abstrakt. Det er dog gyldigt inde i grænsefladen, fordi det giver implementering af accessor.
Du kan dog ikke gøre noget som val prop: Int = 23
inde i grænsefladen.
Implementering af to eller flere grænseflader i en klasse
Kotlin tillader ikke ægte multipel arv. Det er dog muligt at implementere to eller flere grænseflader i en enkelt klasse. For eksempel,
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() )
Når du kører programmet, vil output være:
Fra interface A Fra interface B
Løsning af overordnede konflikter (Multiple Interface)
Antag, to grænseflader (A og B) har en ikke-abstrakt metode med samme navn (lad os sige callMe()
metode). Du implementerede disse to grænseflader i en klasse (lad os sige C). Nu, hvis du kalder callMe()
metoden ved hjælp af objektet i klasse C, vil compileren kaste fejl. For eksempel,
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() )
Her er fejlen:
Fejl: (14, 1) Kotlin: Klasse 'C' skal tilsidesætte offentlig åben sjov callMe (): Enhed defineret i A, fordi den arver flere interface-metoder til den
For at løse dette problem skal du give din egen implementering. Sådan gør du:
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() )
Nu når du kører programmet, vil output være:
Fra interface A Fra interface B
Her gives eksplicit implementering af callMe()
metode i klasse C.
klasse C: A, B (tilsidesætte fun callMe () (super.callMe () super .callMe ()))
Erklæringen super.callMe()
kalder callMe()
metoden for klasse A. På samme måde kalder den metoden for klasse .super.callMe()
callMe()
B