V tomto článku se dozvíte o rozhraních a jak je implementovat v Kotlin pomocí příkladů.
Rozhraní Kotlin jsou podobná rozhraním v Javě 8. Mohou obsahovat definice abstraktních metod i implementace jiných než abstraktních metod. Nemohou však obsahovat žádný stav.
To znamená, že rozhraní může mít vlastnost, ale musí být abstraktní nebo musí poskytovat implementace přístupového objektu.
Doporučená literatura: Kotlin Abstract Class
Abstraktní třídy v Kotlin jsou podobné rozhraní s jedním důležitým rozdílem. Není nutné, aby vlastnosti abstraktní třídy byly abstraktní nebo poskytovaly implementace přístupového objektu.
Jak definovat rozhraní?
Klíčové slovo interface
se používá k definování rozhraní v Kotlin. Například,
interface MyInterface (var test: String // abstract property fun foo () // abstract method fun hello () = "Hello there" // method with default implementation)
Tady,
- je vytvořeno rozhraní MyInterface.
- rozhraní má test abstraktních vlastností a abstraktní metodu
foo()
. - rozhraní má také neabstraktní metodu
hello()
.
Jak implementovat rozhraní?
Tady je způsob, jak může třída nebo objekt implementovat rozhraní:
interface MyInterface (val test: Int // abstract property fun foo (): String // abstract method (returns String) fun hello () (// method with default implementation // body (optional))) class InterfaceImp: MyInterface (override test val: Int = 25 override fun foo () = "Lol" // jiný kód)
Tady třída InterfaceImp implementuje rozhraní MyInterface.
Třída přepíše abstraktní členy (testovací vlastnost a foo()
metoda) rozhraní.
Příklad: Jak rozhraní funguje?
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()) )
Když spustíte program, výstup bude:
test = 25 Volání ahoj (): Ahoj, kámo! Volání a tisk foo (): Lol
Jak bylo uvedeno výše, rozhraní může mít také vlastnost, která poskytuje implementaci přistupujícího objektu. Například,
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) )
Když spustíte program, výstup bude:
23
Tady prop není abstraktní. Je však platný uvnitř rozhraní, protože poskytuje implementaci pro přistupujícího uživatele.
Něco jako val prop: Int = 23
uvnitř rozhraní však nemůžete udělat .
Implementace dvou nebo více rozhraní ve třídě
Kotlin neumožňuje skutečné vícenásobné dědictví. Je však možné implementovat dvě nebo více rozhraní v jedné třídě. Například,
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() )
Když spustíte program, výstup bude:
Z rozhraní A Z rozhraní B
Řešení převažujících konfliktů (více rozhraní)
Předpokládejme, že dvě rozhraní (A a B) mají jinou než abstraktní metodu se stejným názvem (řekněme callMe()
metodu). Implementovali jste tato dvě rozhraní ve třídě (řekněme C). Nyní, pokud zavoláte callMe()
metodu pomocí objektu třídy C, kompilátor vyvolá chybu. Například,
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() )
Zde je chyba:
Chyba: (14, 1) Kotlin: Třída 'C' musí přepsat veřejné otevřené zábavné volání Me (): Jednotka definovaná v A, protože zdědí více metod rozhraní
Chcete-li tento problém vyřešit, musíte poskytnout vlastní implementaci. Zde je postup:
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() )
Nyní, když spustíte program, bude výstup:
Z rozhraní A Z rozhraní B
Zde callMe()
je ve třídě C poskytována explicitní implementace metody.
třída C: A, B (přepsat zábavné callMe () (super.callMe () super .callMe ()))
Příkaz super.callMe()
volá callMe()
metodu třídy A. Podobně volá metodu třídy .super.callMe()
callMe()
B