POO

27/10/2004 - 12:43 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(Byval obj as claseB);
GestorC.funcion2(Byval obj as claseC);
3.-Finalmente tengo una clase D generica con una funcion
ClaseD.funcion3(Byval obj as claseA)

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 Cesarion
27/10/2004 - 14:49 | Informe spam
Todos los objetos tienen un método GetType, el cual te permite identificar
cual es el verdadero tipo de datos del objeto, esto lo puedes utilizar para
identificar cual fue el tipo de datos que te pasaron y convertirlo despues
con CType y ya utilizarlo para llamar la fución correcta

Te envio un ejemplo del uso del GetType, espero que te sirva.

Public Class MyBaseClass
Inherits Object

End Class




Public Class MyDerivedClass
Inherits MyBaseClass
End Class


Public Module module1

Public Sub Main()
Dim mybase1 As New MyBaseClass
Dim myDerived As New MyDerivedClass
Dim o As Object = myDerived
Dim b As MyBaseClass = myDerived
Console.WriteLine("mybase: Type is {0}", mybase1.GetType())
Console.WriteLine("myDerived: Type is {0}", myDerived.GetType())
Console.WriteLine("object o = myDerived: Type is {0}", o.GetType())
Console.WriteLine("MyBaseClass b = myDerived: Type is {0}",
b.GetType())
Console.Read()
End Sub
End Module


"e-lores" wrote:

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(Byval obj as claseB);
GestorC.funcion2(Byval obj as claseC);
3.-Finalmente tengo una clase D generica con una funcion
ClaseD.funcion3(Byval obj as claseA)

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 e-lores
27/10/2004 - 15:26 | Informe spam
Mas o menos es eso, pero lo que me gustaria hacer es algo así como

funcion(Directcast(obj, obj.GetType()))

(esto ya lo he probado y no funciona)
Lo que necesito es obtener una instancia de la clase derivada a partir de la
base (sin utilizar select case o similares)
¿Es posible?

Gracias






"Cesarion" escribió en el mensaje
news:
Todos los objetos tienen un método GetType, el cual te permite


identificar
cual es el verdadero tipo de datos del objeto, esto lo puedes utilizar


para
identificar cual fue el tipo de datos que te pasaron y convertirlo despues
con CType y ya utilizarlo para llamar la fución correcta

Te envio un ejemplo del uso del GetType, espero que te sirva.

Public Class MyBaseClass
Inherits Object

End Class




Public Class MyDerivedClass
Inherits MyBaseClass
End Class


Public Module module1

Public Sub Main()
Dim mybase1 As New MyBaseClass
Dim myDerived As New MyDerivedClass
Dim o As Object = myDerived
Dim b As MyBaseClass = myDerived
Console.WriteLine("mybase: Type is {0}", mybase1.GetType())
Console.WriteLine("myDerived: Type is {0}", myDerived.GetType())
Console.WriteLine("object o = myDerived: Type is {0}",


o.GetType())
Console.WriteLine("MyBaseClass b = myDerived: Type is {0}",
b.GetType())
Console.Read()
End Sub
End Module


"e-lores" wrote:

> 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(Byval obj as claseB);
> GestorC.funcion2(Byval obj as claseC);
> 3.-Finalmente tengo una clase D generica con una funcion
> ClaseD.funcion3(Byval obj as claseA)
>
> 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 Eduardo A. Morcillo [MS MVP VB]
27/10/2004 - 19:27 | Informe spam
Mas o menos es eso, pero lo que me gustaria hacer es algo así como

funcion(Directcast(obj, obj.GetType()))

(esto ya lo he probado y no funciona)
Lo que necesito es obtener una instancia de la clase derivada a
partir de la base (sin utilizar select case o similares)
¿Es posible?



No le veo sentido a eso porque ¿luego de ese supuesto CType en una variable
de que tipo piensas guardar la referencia? Ya debes conocer de antemano el
tipo para poder declarar la variable y entonces podrias hacer directamente
CType(obj, Tipo). Ademas, la gracia de usar el tipo especifico es permitir
al compilador poder comprobar las llamadas y detectar los errores al
compilar.

En mi opinion, si estas necesitando hacer eso se debe a un mal diseño (ojo,
que no tengo todos los detalles del caso). Digo esto porque creo que si
tienes que pasar al metodo un objeto de la clase base, entonces ese metodo
deberia solo usar lo que la clase base expone o en caso de ser necesario
chequear si el objeto implementa alguna interfaz que necesites llamar.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
#4 e-lores
28/10/2004 - 08:41 | Informe spam
Efectivamente se trata de un mal diseño que intento 'parchear'. (No tengo
tiempo para más)
La función de que dispongo esta sobrecargada, pero necesito obtener el
objeto de la clase derivada para que esa sobrecarga sea efectiva (No puedo
pasarle un objeto de la clase base aunque desgraciadamente es lo único que
tengo.)


"Eduardo A. Morcillo [MS MVP VB]" <emorcilloATmvps.org> escribió en el
mensaje news:
> Mas o menos es eso, pero lo que me gustaria hacer es algo así como
>
> funcion(Directcast(obj, obj.GetType()))
>
> (esto ya lo he probado y no funciona)
> Lo que necesito es obtener una instancia de la clase derivada a
> partir de la base (sin utilizar select case o similares)
> ¿Es posible?

No le veo sentido a eso porque ¿luego de ese supuesto CType en una


variable
de que tipo piensas guardar la referencia? Ya debes conocer de antemano el
tipo para poder declarar la variable y entonces podrias hacer directamente
CType(obj, Tipo). Ademas, la gracia de usar el tipo especifico es permitir
al compilador poder comprobar las llamadas y detectar los errores al
compilar.

En mi opinion, si estas necesitando hacer eso se debe a un mal diseño


(ojo,
que no tengo todos los detalles del caso). Digo esto porque creo que si
tienes que pasar al metodo un objeto de la clase base, entonces ese metodo
deberia solo usar lo que la clase base expone o en caso de ser necesario
chequear si el objeto implementa alguna interfaz que necesites llamar.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida