Menu
Coddy logo textTech

Özel Erişimciler

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

Her Kotlin özelliğinin bir getter'ı, her var'ın da bir setter'ı vardır. Varsayılan olarak bunlar depolanmış bir değeri okur ve yazar. Özel bir getter ise her okumada değeri yeniden hesaplar:

class Rectangle(var width: Int, var height: Int) {
    val area: Int
        get() = width * height
}

main içinde:

val r = Rectangle(3, 4)
println(r.area)
r.width = 10
println(r.area)

Çıktı:

12
40

Özel bir setter, özellik her atandığında kodu çalıştırır. İçinde value atanan değerdir ve field özelliğin arkasında depolanan değerdir; backing field:

class Thermostat {
    var target = 20
        set(value) {
            field = value.coerceIn(10, 30)
        }
}

main içinde:

val t = Thermostat()
t.target = 42
println(t.target)
t.target = 18
println(t.target)

Çıktı:

30
18

Bir erişimci içinde özellik adını değil, field kullanın: target özelliğinin ayarlayıcısı içinde target = value yazmak, ayarlayıcıyı tekrar çağırarak sonsuza kadar devam eder:

var target = 20
    set(value) {
        // target = value        // bu setter'ı tekrar çağırır: sonsuz özyineleme
        field = value             // değeri saklar
    }

Bir setter, değişikliklere tepki vermek için de kullanılabilir; örneğin bunları saymak veya günlüğe kaydetmek için:

class Player(name: String) {
    var changes = 0
        private set
    var name = name
        set(value) {
            field = value.trim()
            changes++
        }
}

main içinde:

val p = Player("ada")
p.name = "  Ada  "
p.name = "Ada L."
println("${p.name} after ${p.changes} changes")

Çıktı:

Ada L. after 2 changes
challenge icon

Görev

Kolay

Circle(radius: Double) sınıfını tamamla. radius, setter'ı negatif değerleri 0 olarak saklayan bir var'dır. Özel getter'lara sahip salt okunur diameter ve area özelliklerini (π r², Math.PI ile) ve alanı iki ondalık basamağa yuvarlanmış olarak r=2.0 d=4.0 a=12.57 döndüren label özelliğini ekle ("%.2f".format(area)).

Sağlanan kod her satırdan bir yarıçap okur, label'ı yazdırır, ardından son dairenin yarıçapını iki katına çıkarır ve label'ı tekrar yazdırır; bu nedenle değerler yarıçapı takip etmelidir.

Kodun Circle.kt dosyası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()
    var last = Circle(0.0)
    for (line in input) {
        last = Circle(line.toDouble())
        println(last.label)
    }
    last.radius *= 2
    println(last.label)
}
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