Kotlin-Schnittstellen (mit Beispielen)

In diesem Artikel erfahren Sie anhand von Beispielen, wie Schnittstellen und deren Implementierung in Kotlin erstellt werden.

Kotlin-Schnittstellen ähneln Schnittstellen in Java 8. Sie können Definitionen abstrakter Methoden sowie Implementierungen nicht abstrakter Methoden enthalten. Sie können jedoch keinen Status enthalten.

Das heißt, die Schnittstelle kann Eigenschaften haben, muss jedoch abstrakt sein oder Accessor-Implementierungen bereitstellen.

Literaturempfehlung: Kotlin Abstract Class

Abstrakte Klassen in Kotlin ähneln der Schnittstelle mit einem wichtigen Unterschied. Es ist nicht zwingend erforderlich, dass Eigenschaften einer abstrakten Klasse abstrakt sind oder Accessor-Implementierungen bereitstellen.

Wie definiere ich eine Schnittstelle?

Das Schlüsselwort interfacewird verwendet, um Schnittstellen in Kotlin zu definieren. Beispielsweise,

 Schnittstelle MyInterface (var test: String // abstrakte Eigenschaft fun foo () // abstrakte Methode fun hello () = "Hallo" // Methode mit Standardimplementierung)

Hier,

  • Eine Schnittstelle MyInterface wird erstellt.
  • Die Schnittstelle verfügt über einen abstrakten Eigenschaftstest und eine abstrakte Methode foo().
  • Die Schnittstelle verfügt auch über eine nicht abstrakte Methode hello().

Wie implementiere ich eine Schnittstelle?

So kann eine Klasse oder ein Objekt die Schnittstelle implementieren:

 Schnittstelle MyInterface (Wertetest: Int // abstrakte Eigenschaft fun foo (): String // abstrakte Methode (gibt String zurück) fun hello () (// Methode mit Standardimplementierung // body (optional))) Klasse InterfaceImp: MyInterface (überschreiben val test: Int = 25 override fun foo () = "Lol" // anderer Code) 

Hier implementiert eine Klasse InterfaceImp die MyInterface-Schnittstelle.

Die Klasse überschreibt abstrakte Elemente (Testeigenschaft und foo()-methode) der Schnittstelle.

Beispiel: Wie funktioniert die Schnittstelle?

 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()) )

Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:

test = 25 Hallo anrufen (): Hallo, Kumpel! Aufruf und Drucken von foo (): Lol

Wie oben erwähnt, kann eine Schnittstelle auch eine Eigenschaft aufweisen, die eine Accessor-Implementierung bereitstellt. Beispielsweise,

 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) )

Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:

 23

Hier ist Requisite nicht abstrakt. Es ist jedoch innerhalb der Schnittstelle gültig, da es eine Implementierung für Accessor bietet.

Sie können jedoch nicht so etwas wie val prop: Int = 23innerhalb der Benutzeroberfläche tun .

Implementieren von zwei oder mehr Schnittstellen in einer Klasse

Kotlin erlaubt keine echte Mehrfachvererbung. Es ist jedoch möglich, zwei oder mehr Schnittstellen in einer einzelnen Klasse zu implementieren. Beispielsweise,

 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() )

Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:

 Von Schnittstelle A Von Schnittstelle B. 

Überschreibende Konflikte lösen (Multiple Interface)

Angenommen, zwei Schnittstellen (A und B) haben eine nicht abstrakte Methode mit demselben Namen (sagen wir callMe()Methode). Sie haben diese beiden Schnittstellen in einer Klasse implementiert (sagen wir C). Wenn Sie nun die callMe()Methode mit dem Objekt der Klasse C aufrufen , gibt der Compiler einen Fehler aus. Beispielsweise,

 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() )

Hier ist der Fehler:

 Fehler: (14, 1) Kotlin: Klasse 'C' muss public open fun callMe (): In A definierte Einheit überschreiben, da sie mehrere Schnittstellenmethoden davon erbt

Um dieses Problem zu lösen, müssen Sie Ihre eigene Implementierung bereitstellen. Hier ist wie:

 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() )

Wenn Sie nun das Programm ausführen, lautet die Ausgabe wie folgt:

 Von Schnittstelle A Von Schnittstelle B.

Hier wird eine explizite Implementierung der callMe()Methode in Klasse C bereitgestellt.

Klasse C: A, B (Spaß überschreiben callMe () (super.callMe () super .callMe ()))

Die Anweisung super.callMe()ruft die callMe()Methode der Klasse A auf. Ebenso ruft sie die Methode der Klasse auf .super.callMe()callMe()B

Interessante Beiträge...