V tomto článku se na příkladech dozvíte o přetížení operátoru (definujte, jak operátor pracuje pro typy definované uživatelem, jako jsou objekty).
Když použijete operátor v Kotlin, volá se jeho příslušná členská funkce. Například výraz se a+b
transformuje na a.plus(b)
pod kapotou.
fun main(args: Array) ( val a = 5 val b = 10 print(a.plus(b)) // print(a+b) )
Když spustíte program, výstup bude:
15
Ve skutečnosti je plus()
funkce přetížená, aby fungovala s různými základními typy Kotlin a String
.
// + operátor pro základní typy 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 // for string concatenation operator fun String? .plus (other: Any?): String
Můžete také definovat, jak operátor pracuje pro objekty, přetížením odpovídající funkce. Například musíte definovat, jak +
operátor pracuje pro objekty přetížením plus()
funkce.
Příklad: Přetížení + operátor
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) ) )
Když spustíte program, výstup bude:
součet = (5, 1)
Zde je plus()
funkce označena operator
klíčovým slovem, které kompilátoru řekne, že +
je operátor přetížen.
Výraz p1 + p2
je transformován na p1.plus(p2)
pod kapotou.
Příklad: - Přetížení operátora
V tomto příkladu se naučíte --
operátor přetížení . Výraz --a
je transformován na a.dec()
pod kapotou.
dec()
Členské funkce nemá žádné argumenty.
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) )
Když spustíte program, výstup bude:
bod = (2, -9)
Pamatuj si to,
operátor fun dec () = Bod (- x, --y)
je ekvivalentní k
operator fun dec (): Point (return Point (- x, --y))
Několik důležitých bodů
1. Když přetížíte operátory, měli byste se pokusit zachovat původní ducha operátora. Například,
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) )
Ačkoli výše uvedený program je technicky správný, použili jsme +
operátor k odečtení odpovídajících vlastností dvou objektů, díky nimž byl program matoucí.
2. Na rozdíl od jazyků, jako je Scala, v Kotlin může být přetížena pouze určitá sada operátorů. Na stránce se dozvíte o operátorech, které lze v Kotlině přetížit, a o jejich odpovídajících členských funkcích.