Kotlin sučelja (s primjerima)

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č interfacekoristi 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 = 23suč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.

Zanimljivi članci...