Menu
Coddy logo textTech

Varsayılan Metotlar

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

Bir arayüz metodunun gövdesi olabilir. Bu varsayılan uygulama, onu geçersiz kılmayan her sınıf tarafından kullanılır:

interface Greeter {
    val name: String
    fun greet() = "Hello, I am $name"
}
class Robot(override val name: String) : Greeter
class Pirate(override val name: String) : Greeter {
    override fun greet() = "Ahoy! $name here"
}

main içinde:

println(Robot("R2").greet())
println(Pirate("Anne").greet())

Çıktı:

Hello, I am R2
Ahoy! Anne here

Varsayılan metotlar, arayüzün diğer üyeleri kullanılarak yazılır. Bir sınıf, farklı olan birkaç üyeyi sağlar ve geri kalanını alır:

interface Priced {
    val cents: Int
    fun formatted() = "$%d.%02d".format(cents / 100, cents % 100)
    fun isAffordable(budget: Int) = cents <= budget
}
class Coffee : Priced {
    override val cents = 450
}

main içinde:

val c = Coffee()
println(c.formatted())
println(c.isAffordable(400))

Çıktı:

$4.50
false

Özelliklerin varsayılan bir alıcısı olabilir, ancak bir arayüzün destekleyen alanları yoktur; bu nedenle bir değeri depolayamaz. Başlatıcı içeren bir özellik derlenmez; değeri hesaplayan bir alıcı ise derlenir:

interface Box {
    val width: Int
    val height: Int
    val area: Int
        get() = width * height
    // val count = 0      // hata: arayüzlerde özellik başlatıcılarına izin verilmez
}
class Tile(override val width: Int, override val height: Int) : Box

main içinde:

println(Tile(3, 4).area)

Çıktı:

12

Bir geçersiz kılma, varsayılan uygulamayı yine de kullanabilir. Sınıfın içinde super.method(), arayüzün sürümünü çağırır:

interface Priced {
    val cents: Int
    fun formatted() = "$%d.%02d".format(cents / 100, cents % 100)
}
class Coffee : Priced {
    override val cents = 450
    override fun formatted() = "coffee " + super.formatted()
}

main içinde:

println(Coffee().formatted())

Çıktı:

coffee $4.50
challenge icon

Görev

Kolay

Priced arayüzü, sent cinsinden price değerine sahiptir. $4.50 döndüren varsayılan bir formatted() ve fiyatın bütçeden büyük olmadığını döndüren varsayılan bir isAffordable(budget) sağlayın. Coffee 450 tutarındadır ve formatted() işlevini coffee $4.50 ile geçersiz kılar; varsayılanı super aracılığıyla yeniden kullanır. Sandwich(price) her iki varsayılanı da kullanır.

Sağlanan kod, sent cinsinden bir bütçe ve ardından coffee veya sandwich,650 satırlarını okur. Her öğe için formatted() ile birlikte yes veya no yazdırır.

Kodunuz Priced.kt, Coffee.kt ve Sandwich.kt dosyalarına gelmelidir. Main.kt, sağlanan giriş/çıkış 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()
    val budget = input[0].toInt()
    for (line in input.drop(1)) {
        val p = line.split(",")
        val item: Priced = if (p[0] == "coffee") Coffee() else Sandwich(p[1].toInt())
        println("${item.formatted()} ${if (item.isAffordable(budget)) "yes" else "no"}")
    }
}
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