Patrones de diseño
- 7 April, 2006 //
- informática, trabajo //
- Tags :
- 1 Comment
El problema surge en que para recorrer la lista, el tipo del objeto (item) en cada iteracion debe ser de tipo A (el padre), y que si se llama a item.metodo1() ¡se ejecutara el metodo1 contenido en la clase padre! En lugar de lo correcto, que sería ejecutar el metodo1 de la clase hija a la que pertenezca el item. La solucion consiste en crear un metodo accept(VisitanteA visitante) en todas las clases A e hijas que acepte un “visitante” (una clase de tipo VisitanteA). En el metodo accept se llama al método visit de la clase visitante que se paso como parametro, y el unico parametro del método visit es “this”, un puntero al objeto actual. En la clase VisitanteA se implementa un método visit(A param), otro visit(A1 param), otro visit(A2, param), etc. Uno por cada clase que se quiera “visitar”. En ese método visit(Ax param) es dónde se ejecuta la lógica de nuestro antiguo método1(). De este modo, el Visitante “descubre” la clase del objeto, ya que el objeto se envía a si mismo y debido a la sobrecarga del método visit() se ejecutan las sentencias correctas. Espero haberlo explicado medianamente bien. Por el momento he implementado como 4 o 5 clases visitantes. Tengo muchas herencias inusuales y restricciones semánticas en la base de datos que requieren del patrón. Todo esto me pasa por “mover” el modelo a la base de datos, en lugar de implementarlo en la lógica de negocio. Sin embargo, considero que este enfoque es mejor y más mantenible, aunque más laborioso. En fin, veremos como acaba el proyecto.
tío, soy jorge, pillate el libro de los gof sin falta y enchufatelo. Está muy bien escrito y te hace pensar mejor
Hola!
Esto es muy viejo ya pero tenía que comentarte. El patrón visitor está bien pero esto que dices:
El problema surge en que para recorrer la lista, el tipo del objeto (item) en cada iteracion debe ser de tipo A (el padre), y que si se llama a item.metodo1() ¡se ejecutara el metodo1 contenido en la clase padre! En lugar de lo correcto, que sería ejecutar el metodo1 de la clase hija a la que pertenezca el item.
ES TOTALMENTE ERRONEO! El método a ejecuta se determina en tiempo de ejecución según el tipo dinámico del objeto … No se ejecuta el método del tipo base.
Esto es una de las bases de la POO, así que me parecía importante comentartelo.
Diré así como nota que el problema del que querrías hablar es el “double dispatch” , cuando quieres que metodo1() acepte distintos objetos lease:
int metodo1(TipoPadre)
int metodo1(TipoHijo)
ya que solo se comprueba el tipo estático , lease: si tienes una referencia del tipo TipoPadre que está apuntando a un TipoHijo cuando ejecutes metodo1(referencia) se comprueba el tipo estático -> es una referencia a TipoPadre asi que se ejecuta metodo1(TipoPadre) sin comprobar dinámicante que realmente el objeto es del tipo TipoHijo