In diesem Artikel erfahren Sie anhand von Beispielen, wie Operatoren überladen werden (definieren Sie, wie Operatoren für benutzerdefinierte Typen wie Objekte funktionieren).
Wenn Sie den Operator in Kotlin verwenden, wird die entsprechende Elementfunktion aufgerufen. Zum Beispiel a+b
verwandelt sich a.plus(b)
der Ausdruck in unter der Haube.
fun main(args: Array) ( val a = 5 val b = 10 print(a.plus(b)) // print(a+b) )
Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:
fünfzehn
Tatsächlich ist die plus()
Funktion überlastet, um mit verschiedenen Kotlin-Grundtypen und zu arbeiten String
.
// + Operator für Grundtypen Operator Spaß plus (andere: Byte): Int Operator Spaß plus (andere: Kurz): Int Operator Spaß plus (andere: Int): Int Operator Spaß plus (andere: Lang): Langer Operator Spaß plus (other: Float): Float-Operator fun plus (other: Double): Double // für String-Verkettungsoperator fun String? .plus (other: Any?): String
Sie können auch definieren, wie der Operator für Objekte funktioniert, indem Sie die entsprechende Funktion überladen. Beispielsweise müssen Sie definieren, wie der +
Operator für Objekte plus()
funktioniert, indem Sie die Funktion überladen .
Beispiel: Überladen + Operator
fun main(args: Array) ( val p1 = Point(3, -8) val p2 = Point(2, 9) var sum = Point() sum = p1 + p2 println("sum = ($(sum.x), $(sum.y))") ) class Point(val x: Int = 0, val y: Int = 10) ( // overloading plus function operator fun plus(p: Point) : Point ( return Point(x + p.x, y + p.y) ) )
Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:
Summe = (5, 1)
Hier ist die plus()
Funktion mit einem operator
Schlüsselwort gekennzeichnet, um dem Compiler mitzuteilen, dass der +
Operator überladen ist.
Der Ausdruck p1 + p2
verwandelt sich p1.plus(p2)
unter die Haube.
Beispiel: - Überlastung des Bedieners
In diesem Beispiel lernen Sie, den --
Operator zu überladen . Der Ausdruck --a
verwandelt sich a.dec()
unter die Haube.
Die dec()
Member-Funktion akzeptiert keine Argumente.
fun main(args: Array) ( var point = Point(3, -8) --point println("point = ($(point.x), $(point.y))") ) class Point(var x: Int = 0, var y: Int = 10) ( operator fun dec() = Point(--x, --y) )
Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:
Punkt = (2, -9)
Erinnere dich daran,
Operator Spaß dec () = Punkt (- x, --y)
ist äquivalent zu
Operator Spaß dec (): Punkt (Rückgabepunkt (- x, --y))
Einige wichtige Punkte
1. Wenn Sie Operatoren überladen, sollten Sie versuchen, den ursprünglichen Geist des Operators beizubehalten. Beispielsweise,
fun main(args: Array) ( val p1 = Point(3, -8) val p2 = Point(2, 9) var sum = Point() sum = p1 + p2 println("sum = ($(sum.x), $(sum.y))") ) class Point(val x: Int = 0, val y: Int = 10) ( // overloading plus function operator fun plus(p: Point) = Point(x - p.x, y - p.y) )
Obwohl das obige Programm technisch korrekt ist, haben wir den +
Operator verwendet , um die entsprechenden Eigenschaften von zwei Objekten zu subtrahieren, was das Programm verwirrend machte.
2. Im Gegensatz zu Sprachen wie Scala kann in Kotlin nur eine bestimmte Gruppe von Operatoren überladen werden. Besuchen Sie die Seite, um mehr über Operatoren zu erfahren, die in Kotlin überladen werden können, sowie über die entsprechenden Mitgliedsfunktionen.