Перевантаження оператора Kotlin (з прикладами)

Зміст

У цій статті ви дізнаєтеся про перевантаження оператора (визначте, як працює оператор для визначених користувачем типів, таких як об’єкти), на прикладах.

Коли ви використовуєте оператор у Kotlin, викликається його відповідна функція-член. Наприклад, вираз a+bперетворюється на a.plus(b)під капот.

 fun main(args: Array) ( val a = 5 val b = 10 print(a.plus(b)) // print(a+b) )

Коли ви запускаєте програму, результат буде:

 15

Насправді plus()функція перевантажена для роботи з різними основними типами Kotlin і String.

 // + оператор для основних типів оператор fun plus (інше: Byte): Int operator fun plus (інше: Short): Int operator fun plus (інше: Int): Int operator fun plus (інше: Long): Long operator fun plus (інше: Float): Float оператор fun plus (інше: Double): Double // для оператора конкатенації рядків fun String? .plus (інше: Any?): String 

Ви також можете визначити, як оператор працює з об'єктами, перевантаживши відповідну функцію. Наприклад, вам потрібно визначити, як +оператор працює з об'єктами, перевантажуючи plus()функцію.

Приклад: Перевантаження + Оператор

 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) ) )

Коли ви запускаєте програму, результат буде:

 сума = (5, 1)

Тут plus()функція позначена operatorключовим словом, щоб повідомити компілятору, що +оператор перевантажений.

Вираз p1 + p2перетворюється на p1.plus(p2)під капот.

Приклад: - Перевантаження оператора

У цьому прикладі ви навчитеся перевантажувати --оператора. Вираз --aперетворюється на a.dec()під капот.

Функція- dec()член не приймає жодних аргументів.

 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) )

Коли ви запускаєте програму, вихід буде таким:

 точка = (2, -9) 

Пам'ятайте, що,

 оператор fun dec () = Точка (- x, --y)

еквівалентно

 оператор fun dec (): Point (точка повернення (- x, --y))

Мало важливих моментів

1. Коли ви перевантажуєте операторів, вам слід намагатися зберегти первісний дух оператора. Наприклад,

 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) )

Хоча програма вище є технічно правильною, ми використовували +оператор для віднімання відповідних властивостей двох об’єктів, що зробило програму заплутаною.

2. На відміну від таких мов, як Scala, у Kotlin може бути перевантажений лише певний набір операторів. Відвідайте сторінку, щоб дізнатись про оператори, які можуть бути перевантажені в Kotlin, та відповідні функції членів.

Цікаві статті...