Перегрузка оператора 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.

 // + оператор для базовых типов 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, и их соответствующих функциях-членах.

Интересные статьи...