Objekte überall
Objekte speichern Daten mithilfe von Eigenschaften (
vals undvars) und führen Operationen mit diesen Daten mithilfe von Funktionen durch.
Einige Definitionen:
- Klasse: Definiert Eigenschaften und Funktionen für das, was im Wesentlichen ein neuer Datentyp ist. Klassen werden auch als benutzerdefinierte Typen bezeichnet.
- Mitglied: Entweder eine Eigenschaft oder eine Funktion einer Klasse.
- Mitgliedsfunktion: Eine Funktion, die nur mit einer bestimmten Klasse von Objekten arbeitet.
-
Ein Objekt erstellen: Ein
valodervareiner Klasse erstellen. Auch als eine Instanz dieser Klasse erstellen bezeichnet.
Da Klassen Zustand und Verhalten definieren, können wir sogar Instanzen von eingebauten Typen wie Double oder Boolean als Objekte bezeichnen.
Betrachten Sie die IntRange-Klasse von Kotlin:
// ObjectsEverywhere/IntRanges.kt
fun main() {
val r1 = IntRange(0, 10)
val r2 = IntRange(5, 7)
println(r1)
println(r2)
}
/* Output:
0..10
5..7
*/
Wir erstellen zwei Objekte (Instanzen) der Klasse IntRange. Jedes Objekt hat seinen eigenen Speicherplatz im Speicher. IntRange ist eine Klasse, aber ein bestimmter Bereich r1 von 0 bis 10 ist ein Objekt, das sich von dem Bereich r2 unterscheidet.
Für ein IntRange-Objekt stehen zahlreiche Operationen zur Verfügung. Einige sind einfach, wie sum(), und andere erfordern mehr Verständnis, bevor Sie sie verwenden können. Wenn Sie versuchen, eine aufzurufen, die Argumente benötigt, wird die IDE nach diesen Argumenten fragen.
Um mehr über eine bestimmte Mitgliedsfunktion zu erfahren, schlagen Sie in der Kotlin-Dokumentation nach. Beachten Sie das Lupensymbol im oberen rechten Bereich der Seite. Klicken Sie darauf und geben Sie IntRange in das Suchfeld ein. Klicken Sie auf kotlin.ranges > IntRange aus der resultierenden Suche. Sie sehen die Dokumentation für die IntRange-Klasse. Sie können alle Mitgliedsfunktionen—die Programmierschnittstelle (API)—der Klasse studieren. Obwohl Sie die meisten davon zu diesem Zeitpunkt nicht verstehen werden, ist es hilfreich, sich daran zu gewöhnen, in der Kotlin-Dokumentation nachzuschlagen.
Ein IntRange ist eine Art von Objekt, und ein charakteristisches Merkmal eines Objekts ist, dass Sie Operationen darauf ausführen. Statt “eine Operation ausführen” sagen wir eine Mitgliedsfunktion aufrufen. Um eine Mitgliedsfunktion für ein Objekt aufzurufen, beginnen Sie mit dem Objektbezeichner, dann ein Punkt, dann der Name der Operation:
// ObjectsEverywhere/RangeSum.kt
fun main() {
val r = IntRange(0, 10)
println(r.sum())
}
/* Output:
55
*/
Da sum() eine Mitgliedsfunktion ist, die für IntRange definiert ist, rufen Sie sie auf, indem Sie r.sum() schreiben. Dies summiert alle Zahlen in diesem IntRange.
Frühere objektorientierte Sprachen verwendeten den Ausdruck “eine Nachricht senden”, um das Aufrufen einer Mitgliedsfunktion für ein Objekt zu beschreiben. Manchmal sieht man diese Terminologie noch.
Klassen können viele Operationen (Mitgliedsfunktionen) haben. Es ist einfach, Klassen mit einer IDE (integrierte Entwicklungsumgebung) zu erkunden, die eine Funktion namens Code-Vervollständigung enthält. Wenn Sie zum Beispiel .s nach einem Objektbezeichner in IntelliJ IDEA eingeben, zeigt es alle Mitglieder dieses Objekts an, die mit s beginnen:
Versuchen Sie, die Code-Vervollständigung bei anderen Objekten zu verwenden. Zum Beispiel können Sie einen String umkehren oder alle Zeichen in Kleinbuchstaben umwandeln:
// ObjectsEverywhere/Strings.kt
fun main() {
val s = "AbcD"
println(s.reversed())
println(s.lowercase())
}
/* Output:
DcbA
abcd
*/
Du kannst einen String leicht in einen integer umwandeln und zurück:
// ObjectsEverywhere/Conversion.kt
fun main() {
val s = "123"
println(s.toInt())
val i = 123
println(i.toString())
}
/* Output:
123
123
*/
Später im Buch besprechen wir Strategien, um Situationen zu bewältigen, wenn der String, den Sie konvertieren möchten, keinen korrekten Integer-Wert darstellt.
Sie können auch von einem Zahlentyp zu einem anderen konvertieren. Um Verwirrung zu vermeiden, sind Konvertierungen zwischen Zahlentypen explizit. Zum Beispiel konvertieren Sie ein Int i zu einem Long, indem Sie i.toLong() aufrufen, oder zu einem Double mit i.toDouble():
// ObjectsEverywhere/NumberConversions.kt
fun fraction(numerator: Long, denom: Long) =
numerator.toDouble() / denom
fun main() {
val num = 1
val den = 2
val f = fraction(num.toLong(), den.toLong())
println(f)
}
/* Output:
0.5
*/
Gut definierte Klassen sind für einen Programmierer leicht zu verstehen und erzeugen Code, der leicht zu lesen ist.
Übungen und Lösungen finden Sie unter www.AtomicKotlin.com.