Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Vinculacion dinamica en funcion de los parametros

Iniciado por swapd0, 10 de Febrero de 2010, 10:51:48 PM

« anterior - próximo »

swapd0

En c++ la vinculacion dinamica se hace en funcion del objeto que recibe el mensaje, pero en casos como el que muestro abajo, ¿como se puede hacer que "funcione" en funcion del parametro?.

Tengo una jerarquia de clases para manejar figuras en 2d, tengo un metodo "interseccion" que devuelve la interseccion entre dos objetos (ya se que hay casos en que la interseccion puede dar mas de un punto pero por simplificar).

Pero esta funcion debe ser distinta en funcion del objeto que recibe el mensaje y el que se le pasa como parametro.

class objeto
{
   ...
   virtual vector2d interseccion(const objeto *) const =0;
   ...
};

class linea : public objeto
{
   ...
   // aqui haria un dynamic_cast y llamaria a la funcion correspondiente
   virtual vector2d interseccion(const objeto *) const;
   ...
protected:
   // interseccion entre una linea y xxx
   virtual vector2d interseccion(const linea *) const =0;
   virtual vector2d interseccion(const circulo *) const =0;
   virtual vector2d interseccion(const rectangulo *) const =0;
};

class circulo : public objeto
{
   ...
   virtual vector2d interseccion(const objeto *) const;
   ...
protected:
   // interseccion entre un circulo y xxx
   virtual vector2d interseccion(const linea *) const;
   virtual vector2d interseccion(const circulo *) const;
   virtual vector2d interseccion(const rectangulo *) const;
};

class rectangulo : public objeto
{
   ...
   virtual vector2d interseccion(const objeto *) const;
   ...
protected:
   // interseccion entre un rectangulo y xxx
   virtual vector2d interseccion(const linea *) const;
   virtual vector2d interseccion(const circulo *) const;
   virtual vector2d interseccion(const rectangulo *) const;
};



¿Hay algun patron de diseño que resuelva esto?

Hay una forma mejor de hacer esto y eliminar los dynamic_cast, tampoco vale devolver un enum con el tipo de objeto y hacer un switch ;)


Vicente

El problema que tienes es lo que se llama "double dispatch":

http://en.wikipedia.org/wiki/Double_dispatch

Y hay un patrón para resolverlo que se llama Visitor:

http://en.wikipedia.org/wiki/Visitor_pattern

La idea es que resuelves la ligadura en dos pasos:

ObjetoA.Metodo1(ObjetoB)

Y Metodo1 hace algo como:

ObjetoB.Metodo2(ObjetoA)

Así en Metodo2 ya has resuelto las dos ligaduras como querías :) Un saludo!

Vicente

swapd0

Gracias

Mira que me he leido el libro de los patrones de diseño pero solo me acuerdo de unos pocos :P







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.