Benutzerdefinierte Zugriffsmethoden
Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 7 von 57.
Jede Kotlin-Eigenschaft hat einen Getter, und jedes var hat außerdem einen Setter. Standardmäßig lesen und schreiben sie einen gespeicherten Wert. Ein benutzerdefinierter Getter berechnet den Wert stattdessen bei jedem Lesen neu:
class Rectangle(var width: Int, var height: Int) {
val area: Int
get() = width * height
}Innerhalb von main:
val r = Rectangle(3, 4)
println(r.area)
r.width = 10
println(r.area)Ausgabe:
12
40Ein benutzerdefinierter Setter führt jedes Mal Code aus, wenn der Eigenschaft ein Wert zugewiesen wird. Darin ist value der zugewiesene Wert und field der hinter der Eigenschaft gespeicherte Wert, das Backing Field:
class Thermostat {
var target = 20
set(value) {
field = value.coerceIn(10, 30)
}
}Innerhalb von main:
val t = Thermostat()
t.target = 42
println(t.target)
t.target = 18
println(t.target)Ausgabe:
30
18Verwende innerhalb eines Accessors field, nicht den Namen der Eigenschaft: Wenn du target = value im Setter von target schreibst, würde der Setter erneut aufgerufen werden – für immer:
var target = 20
set(value) {
// target = value // ruft diesen Setter erneut auf: unendliche Rekursion
field = value // speichert den Wert
}Ein Setter ist auch der Ort, um auf Änderungen zu reagieren, zum Beispiel, um sie zu zählen oder zu protokollieren:
class Player(name: String) {
var changes = 0
private set
var name = name
set(value) {
field = value.trim()
changes++
}
}Innerhalb von main:
val p = Player("ada")
p.name = " Ada "
p.name = "Ada L."
println("${p.name} after ${p.changes} changes")Ausgabe:
Ada L. after 2 changesAufgabe
EinfachVervollständige die Klasse Circle(radius: Double). radius ist eine var, deren Setter negative Werte als 0 speichert. Füge die schreibgeschützten Eigenschaften diameter und area (π r² mit Math.PI) mit benutzerdefinierten Gettern hinzu sowie label, das r=2.0 d=4.0 a=12.57 zurückgibt, wobei die Fläche auf zwei Dezimalstellen gerundet wird ("%.2f".format(area)).
Der bereitgestellte Code liest pro Zeile einen Radius ein, gibt label aus, verdoppelt anschließend den Radius des letzten Kreises und gibt label erneut aus. Daher müssen die Werte dem Radius folgen.
Dein Code gehört in Circle.kt. Main.kt enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
fun main() {
// Bereitgestellter Ein-/Ausgabecode: belasse ihn wie er ist
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)
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenPrimärkonstruktoreninit-Blöcke und ValidierungSekundärkonstruktorenRückblick – Bibliotheksausweis4Vererbung
Offene Klassen und UnterklassenÜberschreiben von Membernsuper und KonstruktorenAbstrakte KlassenRückblick – Mitarbeiterverzeichnis2Eigenschaften und Kapselung
Benutzerdefinierte ZugriffsmethodenSichtbarkeitsmodifikatorenPrivate Setterlazy und lateinitWiederholung – Bankkonto5Schnittstellen
Schnittstellen deklarierenStandardmethodenMehrere SchnittstellenSchnittstellen als TypenRückblick – Zahlungsmethoden8Generics
Generische FunktionenGenerische KlassenTypbeschränkungenVarianz mit in und outRückblick – Prioritätswarteschlange11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Kotlin-Playground