Conocer instancia

13/06/2006 - 18:57 por hugo | Informe spam
Hola grupo:

Suponiendo que tengo una clase base y dos derivadas de esa.
ClaseBase
ClaseDerivada1
ClaseDerivada2

Dim Objetox as ClaseBase

Luego en otro lugar se instacia por alguna de las derivadas.
Objetox=newClaseDerivada1

Como puedo saber si Objetox se instancio mediante ClaseDerivada1 o 2.
Gracias y saludos.

Preguntas similare

Leer las respuestas

#1 Leonardo Azpurua [mvp vb]
13/06/2006 - 19:38 | Informe spam
"hugo" escribió en el mensaje
news:
Hola grupo:

Suponiendo que tengo una clase base y dos derivadas de esa.
ClaseBase
ClaseDerivada1
ClaseDerivada2

Dim Objetox as ClaseBase

Luego en otro lugar se instacia por alguna de las derivadas.
Objetox=newClaseDerivada1

Como puedo saber si Objetox se instancio mediante ClaseDerivada1 o 2.
Gracias y saludos.



Hola.

Si ObjetoX esta declarado como ClaseBase es porque no necesitas saber si fue
instanciado como ClaseDerivada1 o como ClaseDerivada2.

Puedes utilizar ObjetoX.GetType.Name [o la alternativa "VB":
TypeName(ObjetoX)], que siempre te devolverá el nombre del tipo concreto de
la instancia.

Pero deberias revisar tu diseño: la idea de usar una clase base es ocultar
los detalles de las clases derivadas. La decision que debes tomar en el
codigo del cliente (basada en el tipo concreto de la instancia) debería
estar resuelta en la clase base.


Salud!
Respuesta Responder a este mensaje
#2 Diego Cofré
13/06/2006 - 19:45 | Informe spam
Hugo:
Podes usar la función GetType que devuelve el tipo de objeto instanciado.
Saludos
Lic. Diego Cofré
Desarrollador
EWAVE GROUP S.A
www.e-wavegroup.com
Respuesta Responder a este mensaje
#3 hugo
13/06/2006 - 20:58 | Informe spam
Bueno a ver si me pueden ayudar con el diseño.

Tengo 2 colecciones.
Una almacena objetos tipo ClaseDerivada1 y otra almacena Objetos
ClaseDerivada2.
Lo que estaba tratando de hacer que un procedimiento pueda guardar ambas
clases derivadas.
Por eso declare un parámetro como ClaseBase para que pueda recibir ambos
tipos, luego, según que tipo instanciado, se almcena en una coleccion o en
otra.
Lo que voy a hacer ahora, es crear dos procedimientos sobrecargados, uno con
parametro de tipo ClaseDerivada1 y Otro con tipo ClaseDeriva2.
Quedo a la espera de comentarios.
Gracias y saludos



Muchas gracias,
"Leonardo Azpurua [mvp vb]" <l e o n a r d o (arroba) m v p s (punto) o r g>
escribió en el mensaje news:

"hugo" escribió en el mensaje
news:
> Hola grupo:
>
> Suponiendo que tengo una clase base y dos derivadas de esa.
> ClaseBase
> ClaseDerivada1
> ClaseDerivada2
>
> Dim Objetox as ClaseBase
>
> Luego en otro lugar se instacia por alguna de las derivadas.
> Objetox=newClaseDerivada1
>
> Como puedo saber si Objetox se instancio mediante ClaseDerivada1 o 2.
> Gracias y saludos.

Hola.

Si ObjetoX esta declarado como ClaseBase es porque no necesitas saber si


fue
instanciado como ClaseDerivada1 o como ClaseDerivada2.

Puedes utilizar ObjetoX.GetType.Name [o la alternativa "VB":
TypeName(ObjetoX)], que siempre te devolverá el nombre del tipo concreto


de
la instancia.

Pero deberias revisar tu diseño: la idea de usar una clase base es ocultar
los detalles de las clases derivadas. La decision que debes tomar en el
codigo del cliente (basada en el tipo concreto de la instancia) debería
estar resuelta en la clase base.


Salud!


Respuesta Responder a este mensaje
#4 Leonardo Azpurua [mvp vb]
14/06/2006 - 00:03 | Informe spam
"hugo" escribió en el mensaje
news:
Bueno a ver si me pueden ayudar con el diseño.

Tengo 2 colecciones.
Una almacena objetos tipo ClaseDerivada1 y otra almacena Objetos
ClaseDerivada2.
Lo que estaba tratando de hacer que un procedimiento pueda guardar ambas
clases derivadas.
Por eso declare un parámetro como ClaseBase para que pueda recibir ambos
tipos, luego, según que tipo instanciado, se almcena en una coleccion o en
otra.
Lo que voy a hacer ahora, es crear dos procedimientos sobrecargados, uno
con
parametro de tipo ClaseDerivada1 y Otro con tipo ClaseDeriva2.
Quedo a la espera de comentarios.
Gracias y saludos



Hola, Hugo:

Fue lo primero que probe (a ver si podia sugerirte alguna solucion), pero al
menos con VB 2003 el compilador no está en capacidad de conocer el tipo
específico (aparentemente, la resolucion de la sobrecarga se realiza en
tiempo de compilacion).

El procedimiento se ve lo suficientmente simple como para que una decision
basada en el tipo no complique demasiado las cosas. Pero por lo general hay
que evitar las desviaciones de los principios: aunque con frecuencia un mal
paso es un simple hecho aislado, otras veces es el comienzo de un mal
camino.

Para proponerte una solucion "formalmente correcta", necesitaría más
información. Qué representan las colecciones? Cual es su visibilidad? Quien
es el responsable de su administración? (o lo que es lo mismo: dónde esta el
procedimiento en cuestion?).

Salud!
Respuesta Responder a este mensaje
#5 Eduardo A. Morcillo [MS MVP VB]
14/06/2006 - 00:42 | Informe spam
Fue lo primero que probe (a ver si podia sugerirte alguna solucion),
pero al menos con VB 2003 el compilador no está en capacidad de
conocer el tipo específico (aparentemente, la resolucion de la
sobrecarga se realiza en tiempo de compilacion).



El compilador siempre crea el IL que llama al metodo mas especifico. Por
ejemplo:

Public Class Base
End Class

Public Class Derivada1 : Inherits Base
End Class

Public Class Derivada2 : Inherits Base
End Class

Public Class Derivada3 : Inherits Base
End Class

Module Module1

Sub HacerAlgo(ByVal obj As Object) ' 1
End Sub

Sub HacerAlgo(ByVal obj As Base) ' 2
End Sub

Sub HacerAlgo(ByVal obj As Derivada1) ' 3
End Sub

Sub HacerAlgo(ByVal obj As Derivada2) ' 4
End Sub

Sub HacerAlgo(ByVal obj As Derivada3) ' 5
End Sub

Sub Main()

Dim a As Base
Dim b As Derivada1
Dim c As Derivada2
Dim d As Derivada3
Dim e As String

HacerAlgo(a) ' Llama a 2 porque es mas especifico que 1 y no
corresponde el tipo en los otros
HacerAlgo(b) ' Llama a 3 porque es mas especifico que 1 y 2 y no
corresponde el tipo en los otros
HacerAlgo(c) ' Llama a 4 porque es mas especifico que 1 y 2 y no
corresponde el tipo en los otros
HacerAlgo(d) ' Llama a 2 porque es mas especifico que 1 y no
corresponde el tipo en los otros
HacerAlgo(e) ' Llama a 1 porque no corresponde el tipo en los otros

End Sub

End Module

Yo creo que con tener el metodo con la clase base es mas que suficiente.
Luego si la implementacion es muy diferente para uno u otro tipo
probablemente lo resolveria con sobrecargas para cada tipo, pero privadas
(como para ordenar un poco el codigo) y solo seria publica la sobrecarga
generica.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida