У цій статті ви дізнаєтеся про перевантаження оператора (визначте, як працює оператор для визначених користувачем типів, таких як об’єкти), на прикладах.
Коли ви використовуєте оператор у 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, та відповідні функції членів.