Seguimos con la serie de ejemplos de código en Groovy. Una de las características de este lenguaje es que podemos añadir "extensiones" a una clase previamente definida. Esto es definir nuevas funcionalidades por llamarlo de una manera.
Tenemos la siguiente clase:
class Ventana{
int alto
}
Posee tan solo un atributo de tipo int (alto), pero si queremos agregarle un método/atributo (por ej. ancho) podemos hacerlo mediante ExpandoMetaClass.
class Ventana{
int alto
}
//main del programa
Ventana.metaClass.getAncho << {-> 200}
def ventana=new Ventana()
ventana.with{ alto=150 }
println "Alto: $ventana.alto"
println "Ancho:$ventana.ancho"
Con esto obtenemos métodos y atributos de manera dinámica.
En este ejemplo hacemos uso de las "bondades" de ExpandoMetaclass, agregamos nuevos métodos y propiedades a las clases previamente definidas
abstract class SuperHeroe{
abstract void volar()
}
abstract class Vigilante{
boolean tieneArmadura=false
boolean tieneAyudante=false
}
class Superman extends SuperHeroe{
int edad
void volar(){
println "Superman puede volar"
}
}
class Batman extends Vigilante{
String nombre
}
static main(args) {
Batman.metaClass.getEdad << {-> 39 }
Batman.metaClass.getAyudante << {-> "Robin"}
Superman.metaClass.getNombre << {-> "Clark Kent"}
def batman=new Batman(nombre:"Bruce Wayne")
def superman=new Superman(edad:38)
batman.with{
tieneArmadura=true
tieneAyudante=true
}
Batman.metaClass.verDatos << { println "nombre real: $nombre, edad: $edad, ayudante: $ayudante"}
Superman.metaClass.verDatos << {println "nombre real: $nombre, edad: $edad"}
superman.verDatos()
superman.volar()
if(batman.tieneAyudante && batman.tieneArmadura){
batman.verDatos()
}
}
Esta funcionalidad nos permite agregar constructores, métodos o sobre escribirlos, etc.
No hay comentarios:
Publicar un comentario