English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной курс Kotlin

Контроль потока Kotlin

Функции в Kotlin

Строки в Kotlin

Ориентированный на объекты (OOP) Kotlin

Перегрузка операторов Kotlin

В этой статье вы узнаете о перегрузке операторов (как операторы работают для пользовательских типов (например, объектов)).

В 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 можно перегрузить только одну группу специфических операторов.