Neste artigo, você aprenderá sobre a sobrecarga do operador (definir como o operador funciona para tipos definidos pelo usuário, como objetos) com a ajuda de exemplos.
Quando você usa o operador no Kotlin, sua função de membro correspondente é chamada. Por exemplo, a expressão a+b
transforma-se a.plus(b)
em algo subjacente.
fun main(args: Array) ( val a = 5 val b = 10 print(a.plus(b)) // print(a+b) )
Quando você executa o programa, a saída será:
15
Na verdade, a plus()
função está sobrecarregada para funcionar com vários tipos básicos de Kotlin e String
.
// + operador para tipos básicos operator fun plus (outro: Byte): Int operator fun plus (other: Short): Int operator fun plus (other: Int): Int operator fun plus (other: Long): Oper operator fun plus (outro: Float): Float operator fun plus (other: Double): Double // para string operador de concatenação fun String? .plus (outro: Any?): String
Você também pode definir como o operador funciona para objetos, sobrecarregando sua função correspondente. Por exemplo, você precisa definir como o +
operador funciona para objetos, sobrecarregando a plus()
função.
Exemplo: Sobrecarga + Operador
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) ) )
Quando você executa o programa, a saída será:
soma = (5, 1)
Aqui, a plus()
função é marcada com a operator
palavra-chave para informar ao compilador que o +
operador está sendo sobrecarregado.
A expressão p1 + p2
é transformada em p1.plus(p2)
sob o capô.
Exemplo: - Sobrecarga do operador
Neste exemplo, você aprenderá a sobrecarregar o --
operador. A expressão --a
é transformada em a.dec()
sob o capô.
A dec()
função de membro não aceita nenhum argumento.
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) )
Quando você executa o programa, a saída será:
ponto = (2, -9)
Lembre-se disso,
operador fun dec () = Point (- x, --y)
é equivalente a
operador fun dec (): Point (return Point (- x, --y))
Alguns pontos importantes
1. Ao sobrecarregar os operadores, você deve tentar manter o espírito original do operador. Por exemplo,
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) )
Embora o programa acima seja tecnicamente correto, usamos o +
operador para subtrair as propriedades correspondentes de dois objetos que tornaram o programa confuso.
2. Ao contrário de linguagens como Scala, apenas um conjunto específico de operadores pode ser sobrecarregado no Kotlin. Visite a página para saber mais sobre os operadores que podem ser sobrecarregados no Kotlin e suas funções-membro correspondentes.