Ricerca…


Osservazioni

Vedi anche: Documentazione di riferimento di Kotlin per Interfacce: Interfacce

Interfaccia di base

Un'interfaccia di Kotlin contiene dichiarazioni di metodi astratti e implementazioni di metodi predefiniti anche se non possono memorizzare lo stato.

interface MyInterface {
    fun bar()
}

Questa interfaccia può ora essere implementata da una classe come segue:

class Child : MyInterface {
   override fun bar() {
       print("bar() was called")
   }
}

Interfaccia con implementazioni predefinite

Un'interfaccia in Kotlin può avere implementazioni predefinite per le funzioni:

interface MyInterface {
    fun withImplementation() {
      print("withImplementation() was called")
    }
}

Le classi che implementano tali interfacce saranno in grado di utilizzare tali funzioni senza reimplementare

class MyClass: MyInterface {
    // No need to reimplement here
}
val instance = MyClass()
instance.withImplementation()

Proprietà

Le implementazioni di default funzionano anche per getter e setter di proprietà:

interface MyInterface2 {
    val helloWorld
        get() = "Hello World!"
}

Le implementazioni degli accessor di interfaccia non possono utilizzare i campi di supporto

interface MyInterface3 {
    // this property won't compile!
    var helloWorld: Int
        get() = field
        set(value) { field = value }
}

Implementazioni multiple

Quando più interfacce implementano la stessa funzione, o tutte definiscono con una o più implementazioni, la classe derivata deve risolvere manualmente la chiamata corretta

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

Proprietà nelle interfacce

È possibile dichiarare le proprietà nelle interfacce. Poiché un'interfaccia non può avere uno stato, puoi dichiarare una proprietà solo come astratta o fornendo un'implementazione predefinita per gli accessor.

interface MyInterface {
    val property: Int // abstract

    val propertyWithImplementation: String
        get() = "foo"

    fun foo() {
        print(property)
    }
}

class Child : MyInterface {
    override val property: Int = 29
}

Conflitti durante l'implementazione di più interfacce con implementazioni predefinite

Quando si implementa più di un'interfaccia che ha metodi con lo stesso nome che includono implementazioni predefinite, è ambiguo per il compilatore quale implementazione dovrebbe essere utilizzata. In caso di conflitto, lo sviluppatore deve sovrascrivere il metodo in conflitto e fornire un'implementazione personalizzata. Tale implementazione può scegliere di delegare o meno alle implementazioni predefinite.

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 parola chiave

interface MyInterface {
    fun funcOne() {
        //optional body
        print("Function with default implementation")
    }
}

Se il metodo nell'interfaccia ha la sua implementazione predefinita, possiamo usare la parola chiave super per accedervi.

super.funcOne()


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow