Menu
Coddy logo textTech

Arayüz Bildirimleri

Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 22 / 57.

Bir arayüz, bir türün nasıl yapacağını söylemeden neler yapabileceğini listeler. Her uygulayan sınıfın sağlaması gereken metotları ve özellikleri bildirir. Bir sınıf, üst sınıfta olduğu gibi bir arayüzü iki nokta üst üste ile uygular; ancak arayüzün kurucusu olmadığı için parantez kullanılmaz:

interface Drawable {
    fun draw(): String
}
class Circle(val radius: Int) : Drawable {
    override fun draw() = "circle with radius $radius"
}
class Line(val length: Int) : Drawable {
    override fun draw() = "-".repeat(length)
}

main içinde:

println(Circle(3).draw())
println(Line(5).draw())

Çıktı:

circle with radius 3
-----

Bir arayüz özellikler de bildirebilir. Sınıf bunları kurucu özellikleri, depolanan özellikleri veya getter'lar olarak sağlar; arayüzün kendisi hiçbir şey depolamaz:

interface Vehicle {
    val wheels: Int
    val label: String
}
class Car(override val label: String) : Vehicle {
    override val wheels = 4
}
class Bike : Vehicle {
    override val wheels = 2
    override val label: String
        get() = "bike on $wheels wheels"
}

main içinde:

println("${Car("taxi").label}: ${Car("taxi").wheels}")
println(Bike().label)

Çıktı:

taxi: 4
bike on 2 wheels

Arayüzün bildirdiği her üye, her biri override ile olmak üzere uygulanmalıdır; aksi takdirde sınıf derlenmez. Bir arayüz örneği oluşturulamaz:

interface Speaker {
    fun speak(): String
    val volume: Int
}
// class Mute : Speaker { override fun speak() = "" }   // hata: volume uygulanmamış
// class Loud : Speaker() { ... }                      // hata: bir arayüzün yapıcısı yoktur
// val s = Speaker()                                   // hata: bir arayüz oluşturulamaz

Bir arayüz ve soyut bir sınıf, gövde olmadan üyeler bildirir. Bir arayüzün kurucusu ve saklanan durumu yoktur; bir sınıf birçok arayüzü uygulayabilir, ancak yalnızca bir sınıfı genişletebilir. Birbirinden bağımsız sınıfların paylaştığı bir yetenek için Drawable veya Comparable gibi bir arayüz; durum içeren ortak bir temel için ise soyut bir sınıf kullanın.

interface Drawable { fun draw(): String }                   // bir yetenek
abstract class Shape(val name: String) { abstract fun area(): Double }   // durum içeren bir taban
class Square(val s: Double) : Shape("square"), Drawable {  // bir sınıf, herhangi arayüzler
    override fun area() = s * s
    override fun draw() = "[]"
}
challenge icon

Görev

Kolay

Shape arayüzünün üyelerini bildirin: salt okunur bir name özelliği ve her ikisi de Double döndüren area() ve perimeter() metotları. Rectangle(width, height) (rectangle adlı) ve Circle(radius) (circle adlı, Math.PI kullanan) sınıflarının bunları uygulamasını sağlayın. Ardından yalnızca Shape üyelerini kullanarak, iki ondalık basamakla rectangle: area 12.00, perimeter 14.00 döndüren describe(shape) işlevini tamamlayın.

Sağlanan kod, r,3,4 veya c,2 satırlarını okur, eşleşen şekli oluşturur ve describe(shape) çıktısını yazdırır.

Kodunuz Shape.kt, Rectangle.kt, Circle.kt ve Functions.kt dosyalarına yazılmalıdır. Main.kt, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

fun main() {
    // Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
    val input = generateSequence(::readLine).toList()
    for (line in input) {
        val p = line.split(",").map { it.trim() }
        val shape: Shape = if (p[0] == "r") Rectangle(p[1].toDouble(), p[2].toDouble()) else Circle(p[1].toDouble())
        println(describe(shape))
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Kotlin playground