U ovom ćete članku naučiti o sučeljima i kako ih primijeniti u Kotlinu uz pomoć primjera.
Kotlin sučelja slična su sučeljima u Javi 8. Mogu sadržavati definicije apstraktnih metoda kao i implementacije neastraktnih metoda. Međutim, oni ne mogu sadržavati nijedno stanje.
Znači, sučelje može imati svojstvo, ali mora biti apstraktno ili mora osigurati implementacije pristupa.
Preporučena literatura: Sažetak tečaja Kotlin
Apstraktne nastave u Kotlinu slične su sučelju s jednom važnom razlikom. Nije obavezno da svojstva apstraktne klase budu apstraktna ili pružaju implementacije pristupa.
Kako definirati sučelje?
Ključna riječ interface
koristi se za definiranje sučelja u Kotlinu. Na primjer,
sučelje MyInterface (var test: String // apstraktno svojstvo fun foo () // apstraktna metoda fun hello () = "Hello there" // metoda sa zadanom implementacijom)
Ovdje,
- kreira se sučelje MyInterface.
- sučelje ima test apstraktnih svojstava i apstraktnu metodu
foo()
. - sučelje također ima apstraktnu metodu
hello()
.
Kako implementirati sučelje?
Evo kako klasa ili objekt mogu implementirati sučelje:
sučelje MyInterface (val test: Int // apstraktno svojstvo fun foo (): String // abstraktna metoda (vraća String) fun hello () (// metoda sa zadanom implementacijom // tijelo (neobavezno))) klasa InterfaceImp: MyInterface (nadjačati val test: Int = 25 nadjačati zabavu foo () = "Lol" // drugi kod)
Ovdje klasa InterfaceImp implementira sučelje MyInterface.
Klasa poništava apstraktne članove (svojstvo i foo()
metoda ispitivanja) sučelja.
Primjer: Kako funkcionira sučelje?
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()) )
Kada pokrenete program, izlaz će biti:
test = 25 Pozivanje zdravo (): Zdravo, prijatelju! Pozivanje i ispis foo (): Lol
Kao što je gore spomenuto, sučelje također može imati svojstvo koje pruža implementaciju pristupa. Na primjer,
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) )
Kada pokrenete program, izlaz će biti:
23
Ovdje rekvizit nije apstraktan. Međutim, vrijedi unutar sučelja jer pruža implementaciju za pristupnike.
Međutim, ne možete učiniti nešto poput val prop: Int = 23
sučelja.
Implementacija dva ili više sučelja u klasi
Kotlin ne dopušta istinsko višestruko nasljeđivanje. Međutim, moguće je implementirati dva ili više sučelja u jednoj klasi. Na primjer,
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() )
Kada pokrenete program, izlaz će biti:
Iz sučelja A Iz sučelja B
Rješavanje prevladavajućih sukoba (višestruko sučelje)
Pretpostavimo da dva sučelja (A i B) imaju apstraktnu metodu s istim nazivom (recimo callMe()
metodu). Ova ste dva sučelja implementirali u klasu (recimo C). Ako callMe()
metodu pozovete pomoću objekta klase C, kompajler će izbaciti pogrešku. Na primjer,
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() )
Evo pogreške:
Error:(14, 1) Kotlin: Class 'C' must override public open fun callMe(): Unit defined in A because it inherits multiple interface methods of it
To solve this issue, you need to provide your own implementation. Here's how:
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() )
Now when you run the program, the output will be:
From interface A From interface B
Here, explicit implementation of callMe()
method is provided in class C.
class C: A, B ( override fun callMe() ( super.callMe() super.callMe() ) )
The statement super.callMe()
calls the callMe()
method of class A. Similarly, super.callMe()
calls the callMe()
method of class B
.