Otra de las características muy útil de Kotlin para los programadores es el concepto de las funciones de extensión.
Mediante las funciones de extensión Kotlin nos permite agregar otros métodos a una clase existente sin tener que heredar de la misma.
Con una serie de ejemplos quedará claro esta característica.
Agregar dos funciones a la clase String que permitan recuperar la primer mitad y la segunda mitad.
fun String.mitadPrimera(): String {
return this.substring(0..this.length/2-1)
}
fun String.segundaMitad(): String{
return this.substring(this.length/2..this.length-1)
}
fun main(args: Array<String>) {
val cadena1 = "Viento"
println(cadena1.mitadPrimera())
println(cadena1.segundaMitad())
}
Para definir una función de extensión a una clase solo debemos anteceder al nombre de la función a que clase estamos extendiendo:
fun String.mitadPrimera(): String {
return this.substring(0..this.length/2-1)
}
Dentro de la función mediante la palabra clave this podemos acceder al objeto que llamó a dicha función (en nuestro ejemplo como llamamos a mitadPrimera mediante el objeto cadena1 tenemos acceso a la cadena "Viento")
Cuando llamamos a una función de extensión lo hacemos en forma idéntica a las otras funciones que tiene la clase:
println(cadena1.mitadPrimera())
La segunda función retorna un String con la segunda mitad del String:
fun String.segundaMitad(): String{
return this.substring(this.length/2..this.length-1)
}
Podemos definir funciones de extensión que sobrescriban funciones ya existentes en la clase, es decir podríamos en la clase String crear una función llamada capitalize() y definir una nueva funcionalidad.
Agregar una función a la clase IntArray que permitan imprimir todas sus componentes en una línea.
fun IntArray.imprimir() {
print("[")
for(elemento in this) {
print("$elemento ")
}
println("]");
}
fun main(args: Array<String>) {
val arreglo1= IntArray(10, {it})
arreglo1.imprimir()
}
Definimos una función de extensión llamada imprimir en la clase IntArray, en su algoritmo mediante un for imprimimos todas sus componentes:
fun IntArray.imprimir() {
print("[")
for(elemento in this) {
print("$elemento ")
}
println("]");
}
En la main definimos un arreglo de tipo IntArray de 10 elemento y guardamos mediante una expresión lambda los valores de 0 al 9.
Como ahora la clase IntArray tiene una función que imprime todas sus componentes podemos llamar directamente al método imprimir de la clase IntArray:
fun main(args: Array<String>) {
val arreglo1= IntArray(10, {it})
arreglo1.imprimir()
}
fun Int.hasta(fin: Int) {
Proyecto160
fun String.imprimir() {
println(this)
}
fun main(args: Array<String>) {
"Hola Mundo".imprimir()
val cadena1 = "Fin"
cadena1.imprimir()
}
Proyecto161
fun Int.hasta(fin: Int) {
for(valor in this..fin)
print("$valor-")
println()
}
fun main(args: Array<String>) {
val v = 10
v.hasta(100)
5.hasta(10)
}