Kotlina saskarnes (ar piemēriem)

Šajā rakstā jūs uzzināsit par saskarnēm un to, kā to ieviest Kotlīnā, izmantojot piemērus.

Kotlina saskarnes ir līdzīgas Java 8 saskarnēm. Tās var saturēt gan abstraktu metožu definīcijas, gan arī abstraktu metožu realizācijas. Tomēr tie nevar saturēt nevienu valsti.

Nozīme, interfeisam var būt īpašums, taču tam jābūt abstraktam vai tam jānodrošina piekļuves ieviešana.

Ieteicamā literatūra: Kotlina abstraktā klase

Abstraktās klases Kotlīnā ir līdzīgas saskarnei ar vienu svarīgu atšķirību. Nav obligāti, lai abstraktas klases īpašības būtu abstraktas vai nodrošinātu piekļuves ieviešanu.

Kā definēt saskarni?

Atslēgvārds interfacetiek izmantots, lai definētu saskarnes Kotlin. Piemēram,

 interfeiss MyInterface (var test: String // abstrakts rekvizīts fun foo () // abstraktā metode fun sveiki () = "Sveiki!" // metode ar noklusējuma ieviešanu)

Šeit,

  • tiek izveidots interfeiss MyInterface.
  • interfeisam ir abstrakts īpašību tests un abstrakta metode foo().
  • interfeisam ir arī metode, kas nav abstrakta hello().

Kā ieviest saskarni?

Lūk, kā klase vai objekts var ieviest saskarni:

 interfeiss MyInterface (val tests: Int // abstrakts rekvizīts fun foo (): String // abstraktā metode (atgriež virkni) fun hello () (// metode ar noklusējuma ieviešanu // body (pēc izvēles))) klases InterfaceImp: MyInterface (ignorēt val tests: Int = 25 ignorē jautru foo () = "Lol" // cits kods) 

Šeit klases InterfaceImp tiek ieviests MyInterface interfeiss.

Klase ignorē foo()interfeisa abstraktos locekļus (testa īpašību un metodi).

Piemērs: Kā darbojas saskarne?

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

Palaidot programmu, izeja būs:

tests = 25 Zvana sveiki (): Sveiks, draugs! Zvanīšana un drukāšana foo (): Lol

Kā minēts iepriekš, interfeisam var būt arī īpašums, kas nodrošina piekļuves ieviešanu. Piemēram,

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

Palaidot programmu, izeja būs:

 23

Šeit rekvizīts nav abstrakts. Tomēr tas ir derīgs saskarnē, jo tas nodrošina piekļuves ieviešanu.

Tomēr jūs nevarat darīt kaut ko līdzīgu val prop: Int = 23interfeisa iekšienē.

Divu vai vairāku saskarņu ieviešana klasē

Kotlins nepieļauj patiesu vairākkārtēju mantošanu. Tomēr vienā klasē ir iespējams ieviest divas vai vairākas saskarnes. Piemēram,

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

Palaidot programmu, izeja būs:

 No saskarnes A No saskarnes B 

Svarīgu konfliktu risināšana (vairāku interfeisu)

Pieņemsim, ka divām saskarnēm (A un B) ir nevis abstrakta metode ar tādu pašu nosaukumu (pieņemsim, ka callMe()metode). Jūs esat ieviesis šīs divas saskarnes klasē (pieņemsim, ka C). Tagad, ja callMe()metodi izsaucat, izmantojot C klases objektu, kompilators izmetīs kļūdu. Piemēram,

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

Šeit ir kļūda:

 Kļūda: (14, 1) Kotlin: C klasei ir jāatskaita publiskais atklātais jautrais zvansMe (): vienība, kas definēta A, jo tā pārmanto vairākas saskarnes metodes

Lai atrisinātu šo problēmu, jums jānodrošina sava ieviešana. Lūk, kā:

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

Tagad, palaižot programmu, izeja būs:

 No saskarnes A No saskarnes B

Šeit skaidra callMe()metodes ieviešana ir paredzēta C klasē.

C klase: A, B (ignorēt jautro zvanuMe () (super.callMe () super. callMe ()))

Paziņojums super.callMe()aicina callMe()metodi A klases Tāpat izsauc metodi klasē .super.callMe()callMe()B

Interesanti raksti...