I den här artikeln lär du dig om operatörsöverbelastning (definiera hur operatören fungerar för användardefinierade typer som objekt) med hjälp av exempel.
När du använder operatör i Kotlin kallas motsvarande medlemsfunktion. Exempelvis a+b
förvandlas uttrycket till a.plus(b)
under huven.
fun main(args: Array) ( val a = 5 val b = 10 print(a.plus(b)) // print(a+b) )
När du kör programmet blir resultatet:
15
Faktum är att plus()
funktionen är överbelastad för att fungera med olika Kotlin-bastyper och String
.
// + operatör för grundläggande typer operator fun plus (övrigt: Byte): Int operator fun plus (övrigt: Short): Int operator fun plus (övrigt: Int): Int operator fun plus (övrigt: Long): Long operator fun plus (övrigt: Float): Float operator fun plus (övrigt: Double): Double // för string concatenation operator fun String? .plus (other: Any?): String
Du kan också definiera hur operatören arbetar för objekt genom att överbelasta dess motsvarande funktion. Du måste till exempel definiera hur +
operatören arbetar för objekt genom överbelastningsfunktion plus()
.
Exempel: Överbelastning + 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ör programmet blir resultatet:
summa = (5, 1)
Här plus()
markeras funktionen med operator
nyckelord för att berätta för kompilatorn att +
operatören överbelastas.
Uttrycket p1 + p2
förvandlas till p1.plus(p2)
under huven.
Exempel: - Överbelastning av operatören
I det här exemplet lär du dig att överbelasta --
operatören. Uttrycket --a
förvandlas till a.dec()
under huven.
Den dec()
medlem fungerar inte vidta några argument.
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ör programmet blir utgången:
punkt = (2, -9)
Kom ihåg det,
operator fun dec () = Point (- x, --y)
är ekvivalent med
operator fun dec (): Point (returpunkt (- x, --y))
Få viktiga punkter
1. När du överbelastar operatörer bör du försöka behålla operatörens ursprungliga anda. Till exempel,
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) )
Även om programmet ovan är tekniskt korrekt har vi använt +
operator för att subtrahera motsvarande egenskaper för två objekt som gjorde programmet förvirrande.
2. Till skillnad från språk som Scala kan endast en viss uppsättning operatörer överbelastas i Kotlin. Besök sidan för att lära dig mer om operatörer som kan överbelastas i Kotlin och deras motsvarande medlemsfunktioner.