Перегрузка операторов — это возможность определять собственное поведение для стандартных операторов (+, -, *, /, == и др.) при работе с пользовательскими типами данных. Это позволяет использовать привычные операторы для объектов ваших классов.
data class Vector(val x: Int, val y: Int) {
operator fun plus(other: Vector) = Vector(x + other.x, y + other.y)
}
val v1 = Vector(1, 2)
val v2 = Vector(3, 4)
println(v1 + v2) // Вывод: Vector(x=4, y=6)
В Kotlin перегрузка реализуется через специальные функции с ключевым словом operator. Каждому оператору соответствует определённое имя функции:
| Оператор | Функция | Пример использования |
|---|---|---|
| + | plus | a + b |
| - | minus | a - b |
| * | times | a * b |
| / | div | a / b |
| == | equals | a == b |
| > | compareTo | a > b |
| [] | get/set | a[i] |
| .. | rangeTo | 1..10 |
Сравните два варианта:
matrix1.add(matrix2).multiply(scalar)
(matrix1 + matrix2) * scalar
Для математических, физических и других специализированных типов:
class Complex(val real: Double, val imaginary: Double) {
operator fun plus(other: Complex) =
Complex(real + other.real, imaginary + other.imaginary)
}
val c1 = Complex(1.0, 2.0)
val c2 = Complex(3.0, 4.0)
println(c1 + c2) // Complex(real=4.0, imaginary=6.0)
Перегрузка операторов активно используется при создании предметно-ориентированных языков:
html {
head {
title { +"Page Title" }
}
body {
h1 { +"Header" }
}
}
data class Money(val amount: Int, val currency: String) {
operator fun compareTo(other: Money) = amount.compareTo(other.amount)
}
val money1 = Money(100, "USD")
val money2 = Money(200, "USD")
println(money1 < money2) // true
class Matrix(private val data: Array<IntArray>) {
operator fun get(row: Int, col: Int) = data[row][col]
operator fun set(row: Int, col: Int, value: Int) {
data[row][col] = value
}
}
val matrix = Matrix(arrayOf(intArrayOf(1, 2), intArrayOf(3, 4)))
println(matrix[1, 0]) // 3
matrix[1, 0] = 5
class Adder(val x: Int) {
operator fun invoke(y: Int) = x + y
}
val adder = Adder(5)
println(adder(3)) // 8
==, перегрузите и hashCode()Перегрузка операторов позволяет:
Основные применения:
Лучшие практики:
Перегрузка операторов — мощный инструмент, который при грамотном использовании делает код более естественным и выразительным, особенно в предметно-ориентированных областях.