Kotlin Arayüzleri (Örneklerle)

Bu yazıda, örnekler yardımıyla arayüzleri ve bunların Kotlin'de nasıl uygulanacağını öğreneceksiniz.

Kotlin arayüzleri Java 8'deki arayüzlere benzer. Soyut yöntemlerin tanımlarını ve soyut olmayan yöntemlerin uygulamalarını içerebilirler. Ancak herhangi bir durum içeremezler.

Anlam, arayüzün özelliği olabilir ancak soyut olması veya erişimci uygulamaları sağlaması gerekir.

Önerilen Kaynaklar: Kotlin Abstract Class

Kotlin'deki soyut sınıflar, önemli bir farkla arayüze benzer. Soyut bir sınıfın özelliklerinin soyut olması veya erişimci uygulamaları sağlaması zorunlu değildir.

Bir arayüz nasıl tanımlanır?

Anahtar kelime interface, Kotlin'de arayüzleri tanımlamak için kullanılır. Örneğin,

 arabirim MyInterface (var test: String // abstract property fun foo () // abstract method fun hello () = "Hello there" // varsayılan uygulama ile metot)

Buraya,

  • bir arayüz MyInterface oluşturulur.
  • arayüzün bir soyut özellik testi ve bir soyut yöntemi vardır foo().
  • arayüz ayrıca soyut olmayan bir yönteme sahiptir hello().

Arayüz nasıl uygulanır?

Bir sınıf veya nesnenin arabirimi nasıl uygulayabileceği aşağıda açıklanmıştır:

 arabirim MyInterface (val test: Int // abstract özellik fun foo (): String // soyut yöntem (String) eğlence merhaba () (// varsayılan uygulamalı yöntem // gövde (isteğe bağlı))) sınıfı ArabirimImp: MyInterface (geçersiz kıl val testi: Int = 25 override fun foo () = "Lol" // diğer kod) 

Burada, bir InterfaceImp sınıfı MyInterface arabirimini uygular.

Sınıf foo(), arabirimin soyut üyelerini (test özelliği ve yöntemi) geçersiz kılar .

Örnek: Arayüz nasıl çalışır?

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

Programı çalıştırdığınızda, çıktı:

test = 25 Merhaba (): Merhaba dostum! Foo () çağırma ve yazdırma: Lol

Yukarıda bahsedildiği gibi, bir arabirim ayrıca erişimci uygulamasını sağlayan bir özelliğe sahip olabilir. Örneğin,

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

Programı çalıştırdığınızda, çıktı:

 23

Burada prop soyut değildir. Ancak, erişimci için uygulama sağladığından arayüz içinde geçerlidir.

Ancak, val prop: Int = 23arayüzün içinde olduğu gibi bir şey yapamazsınız .

Bir Sınıfta İki veya Daha Fazla Arayüz Uygulama

Kotlin gerçek çoklu kalıtıma izin vermez. Bununla birlikte, tek bir sınıfta iki veya daha fazla arabirim uygulamak mümkündür. Örneğin,

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

Programı çalıştırdığınızda, çıktı:

 A arayüzünden B arayüzünden 

Geçersiz kılan çakışmaları çözme (Çoklu Arayüz)

Diyelim ki, iki arayüzün (A ve B) aynı ada sahip soyut olmayan bir metodu var (diyelim callMe()metot). Bu iki arayüzü bir sınıfta uyguladınız (C diyelim). Şimdi, callMe()yöntemi C sınıfının nesnesini kullanarak çağırırsanız , derleyici hata verir. Örneğin,

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

İşte hata:

 Hata: (14, 1) Kotlin: 'C' Sınıfı genel açık eğlence callMe'yi geçersiz kılmalıdır callMe (): A'da tanımlanan birim, birden çok arayüz yöntemini miras aldığından

Bu sorunu çözmek için kendi uygulamanızı sağlamanız gerekir. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

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

Şimdi programı çalıştırdığınızda, çıktı:

 A arayüzünden B arayüzünden

Burada, callMe()C sınıfında yöntemin açık bir şekilde uygulanması sağlanır.

C sınıfı: A, B (eğlenceli callMe () (super.callMe () super .callMe ()) geçersiz kılın )

İfadesi super.callMe()çağırır callMe(), Benzer A sınıfı yöntemini çağırır sınıfının yöntemini .super.callMe()callMe()B

Ilginç makaleler...