В этой статье вы узнаете о перегрузке операторов (определите, как оператор работает для определенных пользователем типов, таких как объекты) с помощью примеров.
Когда вы используете оператор в 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
.
// + оператор для базовых типов 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): Оператор с плавающей запятой fun plus (other: Double): Double // для оператора конкатенации строк fun String? .plus (other: 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 () = Point (- x, --y)
эквивалентно
оператор fun dec (): Point (return 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, и их соответствующих функциях-членах.