Kotlin
Interfejsy
Szukaj…
Uwagi
Zobacz także: Dokumentacja referencyjna Kotlin dla interfejsów: interfejsy
Podstawowy interfejs
Interfejs Kotlin zawiera deklaracje metod abstrakcyjnych i implementacje metod domyślnych, chociaż nie mogą one przechowywać stanu.
interface MyInterface {
fun bar()
}
Ten interfejs może teraz zostać zaimplementowany przez klasę w następujący sposób:
class Child : MyInterface {
override fun bar() {
print("bar() was called")
}
}
Interfejs z domyślnymi implementacjami
Interfejs w Kotlin może mieć domyślne implementacje funkcji:
interface MyInterface {
fun withImplementation() {
print("withImplementation() was called")
}
}
Klasy implementujące takie interfejsy będą mogły korzystać z tych funkcji bez ponownej implementacji
class MyClass: MyInterface {
// No need to reimplement here
}
val instance = MyClass()
instance.withImplementation()
Nieruchomości
Implementacje domyślne działają również w przypadku modułów pobierania i ustawiania właściwości:
interface MyInterface2 {
val helloWorld
get() = "Hello World!"
}
Implementacje akcesoriów interfejsu nie mogą korzystać z pól zapasowych
interface MyInterface3 {
// this property won't compile!
var helloWorld: Int
get() = field
set(value) { field = value }
}
Wiele implementacji
Gdy wiele interfejsów implementuje tę samą funkcję lub wszystkie definiują się za pomocą jednej lub więcej implementacji, klasa pochodna musi ręcznie rozwiązać prawidłowe wywołanie
interface A {
fun notImplemented()
fun implementedOnlyInA() { print("only A") }
fun implementedInBoth() { print("both, A") }
fun implementedInOne() { print("implemented in A") }
}
interface B {
fun implementedInBoth() { print("both, B") }
fun implementedInOne() // only defined
}
class MyClass: A, B {
override fun notImplemented() { print("Normal implementation") }
// implementedOnlyInA() can by normally used in instances
// class needs to define how to use interface functions
override fun implementedInBoth() {
super<B>.implementedInBoth()
super<A>.implementedInBoth()
}
// even if there's only one implementation, there multiple definitions
override fun implementedInOne() {
super<A>.implementedInOne()
print("implementedInOne class implementation")
}
}
Właściwości w interfejsach
Możesz zadeklarować właściwości w interfejsach. Ponieważ interfejs nie może mieć stanu, można zadeklarować właściwość tylko jako abstrakcyjną lub przez zapewnienie domyślnej implementacji dla akcesoriów.
interface MyInterface {
val property: Int // abstract
val propertyWithImplementation: String
get() = "foo"
fun foo() {
print(property)
}
}
class Child : MyInterface {
override val property: Int = 29
}
Konflikty przy wdrażaniu wielu interfejsów z implementacjami domyślnymi
W przypadku implementacji więcej niż jednego interfejsu, który ma metody o tej samej nazwie, które obejmują implementacje domyślne, nie jest dla kompilatora niejasne, która implementacja powinna zostać użyta. W przypadku konfliktu programista musi zastąpić metodę powodującą konflikt i podać niestandardową implementację. Ta implementacja może zdecydować się na delegowanie do domyślnych implementacji lub nie.
interface FirstTrait {
fun foo() { print("first") }
fun bar()
}
interface SecondTrait {
fun foo() { print("second") }
fun bar() { print("bar") }
}
class ClassWithConflict : FirstTrait, SecondTrait {
override fun foo() {
super<FirstTrait>.foo() // delegate to the default implementation of FirstTrait
super<SecondTrait>.foo() // delegate to the default implementation of SecondTrait
}
// function bar() only has a default implementation in one interface and therefore is ok.
}
super słowo kluczowe
interface MyInterface {
fun funcOne() {
//optional body
print("Function with default implementation")
}
}
Jeśli metoda w interfejsie ma własną domyślną implementację, możemy użyć super słowa kluczowego, aby uzyskać do niej dostęp.
super.funcOne()