English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой статье вы узнаете о перегрузке операторов (как операторы работают для пользовательских типов (например, объектов)).
В Kotlin при использовании operator вызывается соответствующий член функции. Например, выражение a + b с幕后 преобразуется в a.plus(b).
fun main(args: Array<String>) { val a = 5 val b = 10 print(a.plus(b)) // print(a+b) {}
Когда вы запустите эту программу, вывод будет:
15
Фактически, функция plus() перегружена для обработки различных базовых типов Kotlin и String (строки).
// + оператор для базовых типов оператор fun plus(other: Byte): Int оператор 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 // Для объединения строк operator fun String?.plus(other: Any?): String
Вы также можете определить работу операторов для объектов, перегружая соответствующие функции. Например, вам нужно перегрузить функцию plus() для определения работы оператора + для объектов.
fun main(args: Array<String>) { 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) { // Перегрузка функции plus operator fun plus(p: Point): Point return Point(x + p.x, y + p.y) {} {}
Когда вы запустите эту программу, вывод будет:
sum = (5, 1)
Здесь функция plus() помечена ключом operator, чтобы сообщить компилятору, что оператор + перегружен.
Экспрессия p1 + p2 в фоновом режиме преобразуется в p1.plus(p2).
В этом примере вы узнаете о перегрузке оператора -.
Членская функция dec() не принимает هیچ параметров.
fun main(args: Array<String>) { 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) {}
Когда вы запустите этот программу, вывод будет:
point = (2, -9)
Помните,
operator fun dec() = Point(--x, --y)
Это эквивалентно
operator fun dec(): Point return Point(--x, --y) {}
1. При перегрузке операторов следует стремиться сохранять исходное действие оператора. Например,
fun main(args: Array<String>) { 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) { //Перегрузка функции plus operator fun plus(p: Point) = Point(x - p.x, y - p.y) {}
Хотя上面的 программа технически правильна, мы использовали оператор + для вычитания соответствующих свойств двух объектов, что сделало программу путаной.
В отличие от языков, таких как Scala, в Kotlin можно перегрузить только одну группу специфических операторов.