POO

27/10/2004 - 12:21 por e-lores | Informe spam
¿Como puedo hacer para obtener un objeto concreto si solo tengo su clase
base?

Me explico:

1.-Tengo una clase A y dos clases B y C que heredan de A.
2.-Tengo dos clases que implementan funciones para cada una de las clases B
y C:
GestorB.funcion1(claseB obj);
GestorC.funcion2(claseC obj);
3.-Finalmente tengo una clase D generica con una funcion
ClaseD.funcion3(claseA obj)

Necesito que esta funcion3 llame al gestor adecuado. ¿Como puedo convertir
un objeto a su clase 'primaria' si solo tengo la clase base?

Gracias.

Preguntas similare

Leer las respuestas

#1 A.Poblacion
27/10/2004 - 18:21 | Informe spam
void ClaseD.funcion3(claseA obj)
{
if (obj is ClaseB) GestorB.funcion1((claseB) obj);
else if (obj is ClaseC) GestorC.funcion2((claseC) obj);
}


"e-lores" wrote in message
news:
¿Como puedo hacer para obtener un objeto concreto si solo tengo su clase
base?

Me explico:

1.-Tengo una clase A y dos clases B y C que heredan de A.
2.-Tengo dos clases que implementan funciones para cada una de las clases


B
y C:
GestorB.funcion1(claseB obj);
GestorC.funcion2(claseC obj);
3.-Finalmente tengo una clase D generica con una funcion
ClaseD.funcion3(claseA obj)

Necesito que esta funcion3 llame al gestor adecuado. ¿Como puedo convertir
un objeto a su clase 'primaria' si solo tengo la clase base?

Gracias.


Respuesta Responder a este mensaje
#2 Octavio Hernandez
27/10/2004 - 22:11 | Informe spam
Además de la que te da A.población, otra posible solución sería sobrecargar
el método funcion3() para que tenga dos versiones:

public class ClaseD
{
// ..
public static void funcion3(claseC obj)
{
// para objetos de la clase C
GestorC.funcion2(obj);
}
public static void funcion3(claseB obj)
{
// para objetos de la clase B
GestorB.funcion1(obj);
}
}

Para mí cualquiera de las dos soluciones es mala, en el sentido de que si se
añade una nueva clase D que también hereda de A, habrá que tocar el código
de esta clase 'ClaseD'. Yo repensaría un poco el diseño de esas clases...

Salu2,

Octavio

"e-lores" escribió en el mensaje
news:
¿Como puedo hacer para obtener un objeto concreto si solo tengo su clase
base?

Me explico:

1.-Tengo una clase A y dos clases B y C que heredan de A.
2.-Tengo dos clases que implementan funciones para cada una de las clases


B
y C:
GestorB.funcion1(claseB obj);
GestorC.funcion2(claseC obj);
3.-Finalmente tengo una clase D generica con una funcion
ClaseD.funcion3(claseA obj)

Necesito que esta funcion3 llame al gestor adecuado. ¿Como puedo convertir
un objeto a su clase 'primaria' si solo tengo la clase base?

Gracias.


Respuesta Responder a este mensaje
#3 e-lores
28/10/2004 - 08:37 | Informe spam
Eso es exactamente lo que tengo, una funcion sobrecargada, pero el problema
es que no solamente tengo 2 clases si no unas cuantas y por lo tanto
necesito obtener un objeto de la clase derivada a partir de la clase base
pero sin utilizar if's (o switch's o algo por el estilo). Es decir,
necesitaria algo así como

funcionSobrecargada( (objBase.GetType()) objBase);

No se si me explico bien.


"Octavio Hernandez" escribió en el mensaje
news:

Además de la que te da A.población, otra posible solución sería


sobrecargar
el método funcion3() para que tenga dos versiones:

public class ClaseD
{
// ..
public static void funcion3(claseC obj)
{
// para objetos de la clase C
GestorC.funcion2(obj);
}
public static void funcion3(claseB obj)
{
// para objetos de la clase B
GestorB.funcion1(obj);
}
}

Para mí cualquiera de las dos soluciones es mala, en el sentido de que si


se
añade una nueva clase D que también hereda de A, habrá que tocar el código
de esta clase 'ClaseD'. Yo repensaría un poco el diseño de esas clases...

Salu2,

Octavio

"e-lores" escribió en el mensaje
news:
> ¿Como puedo hacer para obtener un objeto concreto si solo tengo su clase
> base?
>
> Me explico:
>
> 1.-Tengo una clase A y dos clases B y C que heredan de A.
> 2.-Tengo dos clases que implementan funciones para cada una de las


clases
B
> y C:
> GestorB.funcion1(claseB obj);
> GestorC.funcion2(claseC obj);
> 3.-Finalmente tengo una clase D generica con una funcion
> ClaseD.funcion3(claseA obj)
>
> Necesito que esta funcion3 llame al gestor adecuado. ¿Como puedo


convertir
> un objeto a su clase 'primaria' si solo tengo la clase base?
>
> Gracias.
>
>


Respuesta Responder a este mensaje
#4 A.Poblacion
28/10/2004 - 18:48 | Informe spam
"e-lores" wrote in message
news:
[...]
necesitaria algo así como

funcionSobrecargada( (objBase.GetType()) objBase);



No puede ser. Para llamar a una función sobrecargada, el compilador
necesita saber *en tiempo de compilación* el tipo de los parámetros, para
compilar una llamada a la sobrecarga adecuada. Así que no tienes más remedio
que usar una función que tenga un argumento del tipo de la clase base, y
dentro de ella usar switches o if's para distinguir el tipo del objeto.
O, mejor todavía, cambiar el diseño, y usar polimorfismo sobre los
objetos de las clases derivadas para que se decida automáticamente sin
switches ni if's ni nada cuál es la función que se ejecuta.
Respuesta Responder a este mensaje
#5 Kravek
28/10/2004 - 21:52 | Informe spam
Hago una pregunta...

En C++ "NORMAL" se podían declarar punteros a funciones, quizás esté
buscando algo parecido
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida