Dalam artikel ini, anda akan belajar mengenai antara muka dan cara menerapkannya di Kotlin dengan bantuan contoh.
Antaramuka Kotlin mirip dengan antara muka di Java 8. Mereka boleh mengandungi definisi kaedah abstrak dan juga pelaksanaan kaedah bukan abstrak. Namun, mereka tidak boleh mengandungi keadaan.
Maksudnya, antara muka mungkin mempunyai harta tetapi perlu abstrak atau harus menyediakan pelaksanaan aksesor.
Bacaan yang Disyorkan: Kelas Abstrak Kotlin
Kelas abstrak di Kotlin serupa dengan antara muka dengan satu perbezaan penting. Tidak wajib bagi sifat kelas abstrak untuk menjadi abstrak atau menyediakan pelaksanaan aksesori.
Bagaimana untuk menentukan antara muka?
Kata kunci interface
digunakan untuk menentukan antara muka di Kotlin. Sebagai contoh,
antara muka MyInterface (ujian var: String // abstract properti fun foo () // kaedah abstrak fun hello () = "Hello there" // kaedah dengan pelaksanaan lalai)
Di sini,
- antara muka MyInterface dibuat.
- antara muka mempunyai ujian harta abstrak dan kaedah abstrak
foo()
. - antara muka juga mempunyai kaedah yang tidak abstrak
hello()
.
Bagaimana melaksanakan antara muka?
Inilah cara kelas atau objek dapat melaksanakan antara muka:
antara muka MyInterface (ujian val: Int // abstract properti fun foo (): String // kaedah abstrak (mengembalikan String) fun hello () (// kaedah dengan pelaksanaan lalai // body (pilihan))) kelas InterfaceImp: MyInterface (override ujian val: Int = 25 menimpa fun foo () = "Lol" // kod lain)
Di sini, InterfaceImp kelas menerapkan antara muka MyInterface.
Kelas mengatasi anggota abstrak (harta dan foo()
kaedah ujian ) antara muka.
Contoh: Bagaimana antara muka berfungsi?
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()) )
Semasa anda menjalankan program, outputnya adalah:
test = 25 Memanggil halo (): Hai, kawan! Memanggil dan mencetak foo (): Lol
Seperti yang disebutkan di atas, antarmuka juga dapat memiliki properti yang menyediakan implementasi aksesor. Sebagai contoh,
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) )
Semasa anda menjalankan program, outputnya adalah:
23
Di sini, prop tidak abstrak. Walau bagaimanapun, ia berlaku di antara muka kerana menyediakan pelaksanaan untuk aksesor.
Walau bagaimanapun, anda tidak boleh melakukan sesuatu seperti val prop: Int = 23
di dalam antara muka.
Melaksanakan Dua atau Lebih Antara Muka dalam Kelas
Kotlin tidak membenarkan warisan berganda yang sebenar. Walau bagaimanapun, mungkin untuk melaksanakan dua atau lebih antara muka dalam satu kelas. Sebagai contoh,
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() )
Semasa anda menjalankan program, outputnya adalah:
Dari antara muka A Dari antara muka B
Menyelesaikan konflik mengatasi (Antaramuka Pelbagai)
Katakan, dua antara muka (A dan B) mempunyai kaedah bukan abstrak dengan nama yang sama (katakan callMe()
kaedah). Anda melaksanakan kedua-dua antara muka ini dalam kelas (katakanlah C). Sekarang, jika anda memanggil callMe()
kaedah menggunakan objek kelas C, penyusun akan membuang kesalahan. Sebagai contoh,
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() )
Inilah ralatnya:
Ralat: (14, 1) Kotlin: Kelas 'C' mesti mengatasi panggilan terbuka terbuka umumMe (): Unit yang ditentukan dalam A kerana mewarisi beberapa kaedah antara muka
Untuk menyelesaikan masalah ini, anda perlu memberikan pelaksanaan anda sendiri. Ini caranya:
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() )
Sekarang semasa anda menjalankan program, outputnya adalah:
Dari antara muka A Dari antara muka B
Di sini, pelaksanaan callMe()
kaedah secara eksplisit disediakan di kelas C.
kelas C: A, B (ganti seru callMe () (super.callMe () super .callMe ()))
Penyataan super.callMe()
memanggil callMe()
kaedah kelas A. Begitu juga, memanggil kaedah kelas .super.callMe()
callMe()
B