Sobrecarga del operador de Kotlin

Dado que Kotlin proporciona tipos definidos por el usuario, también proporciona la funcionalidad adicional para sobrecargar los operadores estándar, de modo que trabajar con tipos definidos por el usuario sea más fácil. Todos los operadores unarios, binarios y relacionales se pueden sobrecargar. Los operadores están sobrecargados ya sea a través de las funciones miembro oa través de las funciones de extensión . Estas funciones están precedidas por el modificador de operador . Hay funciones estándar para cada tipo de operador que se pueden sobrecargar según el uso.

Operadores Unarios –

La siguiente tabla muestra las diversas funciones que se pueden definir para los operadores unarios. Estas funciones modifican la instancia de llamada.

Expresión del operador función correspondiente
+x x.unaryPlus()
-X x.unarioMenos()
!X x.no()

Aquí, x corresponde al tipo para el que se define el operador. La funcionalidad sobrecargada se define dentro de las funciones respectivas.

Programa Kotlin para demostrar la sobrecarga del operador unario:

class UnaryOverload(var str:String) {
    // overloading the function
    operator fun unaryMinus() {
        str = str.reversed()
    }
}
// main function
fun main(args : Array<String>) {
    val obj = UnaryOverload("HELLO")
    println("Initial string is ${obj.str}")y
    //calling the overloaded function unaryMinus()
    -obj
    println("String after applying unary operator ${obj.str}")
}

Producción:

Initial string is HELLO
String after applying unary operator OLLEH

Operadores de incremento y decremento –

El operador de incremento y decremento se puede definir para un tipo a través de las siguientes funciones. Esta función devuelve una nueva instancia con el resultado de la expresión.

Expresión del operador función correspondiente
++ x x.inc()
– – X x.dec()

Ya sea que se usen en notación de postfijo o prefijo, estas funciones funcionan bien en ambos casos, con el mismo resultado esperado, como se esperaría al usar notaciones de prefijo o postfijo .

Programa Kotlin para demostrar la sobrecarga del operador:

class IncDecOverload(var str:String) {
    // overloading increment function
    operator fun inc(): IncDecOverload {
        val obj = IncDecOverload(this.str)
        obj.str = obj.str + 'a'
        return obj
    }
    // overloading decrement function
    operator fun dec(): IncDecOverload {
        val obj = IncDecOverload(this.str)
        obj.str = obj.str.substring(0,obj.str.length-1)
        return obj
    }
   
    override fun toString(): String {
        return str
    }
}
// main function
fun main(args: Array<String>) {
    var obj = IncDecOverload("Hello")
    println(obj++)
    println(obj--)
    println(++obj)
    println(--obj)
}

Producción:

Hello
Helloa
Helloa
Hello

Operadores binarios –

La siguiente tabla muestra los operadores binarios y sus funciones equivalentes a definir. Todas estas funciones modifican la instancia de llamada.

Expresión del operador función correspondiente
x1 + x2 x1.más(x2)
x1 – x2 x1.menos(x2)
x1 * x2 x1.veces(x2)
x1/x2 x1.div(x2)
x1 % x2 x1.rem(x2)
x1..x2 x1.rango a(x2)

Programa Kotlin para sobrecargar la función más –

class Object(var objName: String) {
    // Overloading the function
    operator fun plus(b: Int) {
        objName = "Name is $objName and data is $b"
    }
    override fun toString(): String {
        return objName
    }
}
// main function
fun main() {
    val obj = Object("Chair")
    // Calling the overloaded function
    obj+9
    println(obj)
}

Producción:

Name is Chair and data is 9

Nota : los operadores relacionales no tienen funciones específicas para definir, para usar operadores relacionales en instancias de un tipo definido por el usuario, el tipo debe implementar la interfaz Comparable .

Otros operadores –

Kotlin admite una amplia gama de operadores, por lo que definir cada uno para un tipo no es una buena práctica de programación. La siguiente tabla muestra algunos de los otros operadores útiles que se pueden sobrecargar en Kotlin.

Expresión del operador función correspondiente
x1 en x2 x2.contiene(x1)
x1 !en x2 !x2.contiene(x1)
x[yo] x.obtener(i)
x[yo, j] x.get(i, j)
x[i] = b x.conjunto(i, b)
x[i,j] = b x.conjunto(i, j, b)
X() x.invocar()
x(yo) x.invocar(i)
x(yo, j) x. invocar (i, j)
x1 += x2 x1.plusAssign(x2)
x1 -= x2 x1.menosAsignar(x2)
x1 *= x2 x1.vecesAsignar(x2)
x1 /= x2 x1.divAssign(x2)
x1 %= x2 x1.remAsignar(x2)

Publicación traducida automáticamente

Artículo escrito por CharchitKapoor y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *