Kotlin-grænseflader (med eksempler)

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 interfacebruges 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 = 23inde 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

Interessante artikler...