I denne artikel lærer du om operatøroverbelastning (definer hvordan operatør fungerer for brugerdefinerede typer som objekter) ved hjælp af eksempler.
Når du bruger operator i Kotlin, kaldes den tilsvarende medlemsfunktion. Eksempelvis a+b
omdannes udtryk til a.plus(b)
under emhætten.
fun main(args: Array) ( val a = 5 val b = 10 print(a.plus(b)) // print(a+b) )
Når du kører programmet, vil output være:
15
Faktisk er plus()
funktionen overbelastet for at arbejde med forskellige Kotlin basistyper og String
.
// + operator for basistyper operator fun plus (andet: Byte): Int operator fun plus (andet: Short): Int operator fun plus (andet: Int): Int operator fun plus (andet: Long): Long operator fun plus (andet: Float): Float operator fun plus (other: Double): Double // for string concatenation operator fun String? .plus (other: Any?): String
Du kan også definere, hvordan operatøren arbejder for objekter ved at overbelaste den tilsvarende funktion. For eksempel skal du definere, hvordan +
operatøren arbejder for objekter ved hjælp af overbelastningsfunktion plus()
.
Eksempel: Overbelastning + operatør
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) ) )
Når du kører programmet, vil output være:
sum = (5, 1)
Her er plus()
funktionen markeret med operator
nøgleord for at fortælle kompilatoren, at +
operatøren overbelastes.
Udtrykket p1 + p2
omdannes til p1.plus(p2)
under hætten.
Eksempel: - Overbelastning af operatør
I dette eksempel lærer du at overbelaste --
operatøren. Udtrykket --a
omdannes til a.dec()
under hætten.
Det dec()
medlem Funktionen tager ikke nogen argumenter.
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) )
Når du kører programmet, vil udgangen være:
punkt = (2, -9)
Huske på, at,
operator fun dec () = Punkt (- x, --y)
svarer til
operator fun dec (): Punkt (returpunkt (- x, --y))
Få vigtige punkter
1. Når du overbelaster operatører, skal du prøve at opretholde operatørens oprindelige ånd. For eksempel,
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) )
Selvom ovenstående program er teknisk korrekt, har vi brugt +
operator til at trække tilsvarende egenskaber af to objekter, der gjorde programmet forvirrende.
2. I modsætning til sprog som Scala kan kun et specifikt sæt operatører overbelastes i Kotlin. Besøg siden for at lære om operatører, der kan overbelastes i Kotlin og deres tilsvarende medlemsfunktioner.