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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow