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