W tym artykule dowiesz się o przeciążaniu operatorów (określ, jak działa operator dla typów zdefiniowanych przez użytkownika, takich jak obiekty) za pomocą przykładów.
Kiedy używasz operatora w Kotlinie, wywoływana jest odpowiednia funkcja członkowska. Na przykład wyrażenie zostanie a+b
przekształcone w „ a.plus(b)
pod maską”.
fun main(args: Array) ( val a = 5 val b = 10 print(a.plus(b)) // print(a+b) )
Po uruchomieniu programu wynik będzie następujący:
15
W rzeczywistości plus()
funkcja jest przeciążona, aby współpracować z różnymi podstawowymi typami Kotlin i String
.
// + operator dla typów podstawowych 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 // dla konkatenacji ciągów operator fun String? .plus (other: Any?): String
Możesz także zdefiniować sposób działania operatora dla obiektów, przeciążając odpowiadającą mu funkcję. Na przykład musisz zdefiniować sposób działania +
operatora dla obiektów przez przeciążenie plus()
funkcji.
Przykład: przeciążenie + 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) ) )
Po uruchomieniu programu wynik będzie następujący:
suma = (5, 1)
Tutaj plus()
funkcja jest oznaczona operator
słowem kluczowym, aby poinformować kompilator, że +
operator jest przeciążony.
Wyraz p1 + p2
zmienia się w p1.plus(p2)
pod maską.
Przykład: - Przeciążanie operatorów
W tym przykładzie nauczysz się przeciążać --
operatora. Wyraz --a
zmienia się w a.dec()
pod maską.
Funkcja dec()
członkowska nie przyjmuje żadnych argumentów.
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) )
Po uruchomieniu programu wynik będzie następujący:
punkt = (2, -9)
Zapamietaj to,
operator fun dec () = Punkt (- x, --y)
jest równa
operator fun dec (): Point (return Point (- x, --y))
Kilka ważnych punktów
1. Kiedy przeciążasz operatorów, powinieneś starać się zachować oryginalnego ducha operatora. Na przykład,
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) )
Chociaż powyższy program jest technicznie poprawny, użyliśmy +
operatora do odjęcia odpowiednich właściwości dwóch obiektów, co spowodowało, że program był zagmatwany.
2. W przeciwieństwie do języków takich jak Scala, tylko określony zestaw operatorów może być przeciążony w Kotlin. Odwiedź tę stronę, aby dowiedzieć się o operatorach, które mogą być przeciążone w Kotlinie i odpowiadających im funkcjach członkowskich.