Przeciążanie operatora Kotlin (z przykładami)

Spisie treści

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+bprzekształ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 operatorsłowem kluczowym, aby poinformować kompilator, że +operator jest przeciążony.

Wyraz p1 + p2zmienia się w p1.plus(p2)pod maską.

Przykład: - Przeciążanie operatorów

W tym przykładzie nauczysz się przeciążać --operatora. Wyraz --azmienia 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.

Interesujące artykuły...