English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin Operator überschreiben

In diesem Artikel werden Sie durch Beispiele lernen, wie Operator überschrieben werden (wie Operatoren für benutzerdefinierte Typen (wie Objekte) funktionieren).

Bei der Verwendung von operator in Kotlin wird die entsprechende Memberfunktion aufgerufen. Zum Beispiel, der Ausdruck a + b wird im Hintergrund in a.plus(b) umgewandelt.

fun main(args: Array<String>) {
    val a = 5
    val b = 10
    print(a.plus(b)) // print(a+b)
}

Wenn Sie das Programm ausführen, ist die Ausgabe:

15

Tatsächlich wird die Funktion plus() überschrieben, um verschiedene Kotlin-Basistypen und String (Zeichenfolge) zu verarbeiten.

// + 基本类型的运算符
Grundtypenoperator
operator fun plus(other: Byte): Int
operator fun plus(other: Short): Int
operator fun plus(other: Int): Int
operator fun plus(other: Long): Long
operator fun plus(other: Float): Float
//operator fun plus(other: Double): Double
für Stringverbindung verwendet

operator fun String?.plus(other: Any?): String+wie Operator auf Objekte arbeiten. Sie können auch durch Überschreiben der entsprechenden Funktionen bestimmen, wie Operator auf Objekte arbeiten. Zum Beispiel müssen Sie den plus()-Operator überschreiben, um

Beispiel: Überschreiben+Operator

fun main(args: Array<String>) {
    val p1 = Point(3, -8)
    val p2 = Point(2, 9)
    var sum = Point()
    sum = p1 + p2
    println("Summe = (${sum.x}, ${sum.y})")
}
class Point(val x: Int = 0, val y: Int = 10) {
    //plus-Operator überschreiben
    operator fun plus(p: Point): Point
        return Point(x + p.x, y + p.y)
    }
}

Wenn Sie das Programm ausführen, ist die Ausgabe:

sum = (5, 1)

Hier wird die plus() Funktion mit dem operator-Schlüsselwort markiert, um dem Compiler + der Operator wird überschrieben.

Ausdruck p1 + p2 wird im Hintergrund in p umgewandelt1.plus(p2)。

Beispiel:- Operatorüberschreibung

In diesem Beispiel werden Sie das Überschreiben von - Operator. Ausdruck --a wird im Hintergrund in a.dec() umgewandelt.

dec() Mitgliedfunktion hat keine Parameter.

fun main(args: Array<String>) {
    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, wird die Ausgabe sein:

point = (2, -9)

Denken Sie daran,

operator fun dec() = Point(--x, --y)

entspricht

operator fun dec(): Point
    return Point(--x, --y)
}

Beachten Sie einige Punkte

1Beim Überschreiben von Operatoren sollte versucht werden, die ursprüngliche Funktion des Operators beizubehalten. Zum Beispiel,

fun main(args: Array<String>) {
    val p1 = Point(3, -8)
    val p2 = Point(2, 9)
    var sum = Point()
    sum = p1 + p2
    println("Summe = (${sum.x}, ${sum.y})")
}
class Point(val x: Int = 0, val y: Int = 10) {
    //Überladung der plus-Funktion
    operator fun plus(p: Point) = Point(x - p.x, y - p.y)
}

Obwohl das obige Programm technisch korrekt ist, verwenden wir + Der Operator subtrahiert die entsprechenden Attribute beider Objekte, was das Programm unübersichtlich macht.

2Im Gegensatz zu Sprachen wie Scala kann in Kotlin nur eine bestimmte Gruppe von Operatoren überschrieben werden.