sábado, 31 de enero de 2015

Groovy en ejemplos ... no. 6

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