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

#6 Leonardo Azpurua [mvp vb]
14/06/2006 - 05:30 | Informe spam
"Eduardo A. Morcillo [MS MVP VB]" <emorcillo .AT. mvps.org> escribió en el
mensaje news:
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:
...
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.



Hola.

O me perdi, o estamos hablando de cosas diferentes.

Si b esta declarado como Base, pero se instancia como New Derivada1, al
llamar a HacerAlgo(b) se ejecutará el metodo 2. Al declarar b como Base
estamos "ocultando" su identidad como instancia de Derivada1.

Teniendo
ClaseBase
ClaseD1 Inherits ClaseBase
ClaseD2 Inherits ClaseBase

y en una unidad (un modulo en una aplicacion de consola):

Private Sub Muestra1(ByVal p As ClaseD1)
Console.WriteLine("D1.Nombre = {0}", p.Nombre)
End Sub

Private Sub Muestra1(ByVal p As ClaseD2)
Console.WriteLine("D2.Nombre = {0}", p.Nombre)
End Sub

Sub Main()
Dim x As ClaseBase = New ClaseD1
Console.WriteLine(x.GetType.Name)
Muestra1(DirectCast(x, ClaseD1))
Console.ReadLine()
End Sub

Si en la tercera linea de Main hubiesemos escrito:

Muestra1(x)

obtenemos un error de compilacion diciendo que la resolucion de la
sobrecarga falló porque no hay una Muestra1 que pueda ser llamada sin una
conversión de reducción (narrowing conversion).

De manera que la determinacion del tipo concreto de una instancia declarada
de una clase base (aun cuando esta clase especifique Must Inherit) no se
realiza en tiempo de ejecución sino en tiempo de compilacion.

Dicho en otras palabras, la sobrecarga no es la solución para el problema
planteado originalmente.

De todas maneras es un mal menor, ya que en el lado "del cliente"
seguramente sabremos a que clase concreta pertenece el objeto, y podemos
realizar el Casting o la conversion de tipos para forzar la llamada al
metodo concreto. Y si no sabemos que clase de objeto es, entonces el
problema es peor de lo que habiamos pensado :-)


Salud!
Respuesta Responder a este mensaje
#7 hugo
14/06/2006 - 20:53 | Informe spam
Tengo un objeto llamado DataBase que tiene Una Coleccion Tables, Una
coleccion Views, y una coleecion llamada TableViews que contiene ambos
tipos.
Ambos tipos derivan de la clase TableView.
El objeto DataBase administra las tres coleeciones.
Las coleeciones, son porpiedades publicas de solo lectura del objeto
DataBase.
Es decir, no se puede hacer DataBase.Tables=.
Ni tampoco se puede hacer DataBase.Tables.add

Las Colecciones Tables y Views, le informan a DataBase con un evento cuando
se agregan o quitan elementos. Y ahi se porcede a hacer lo mismo en la
coleecion TableViews.




"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:
> 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
#8 Leonardo Azpurua [mvp vb]
15/06/2006 - 00:05 | Informe spam
"hugo" escribió en el mensaje
news:%23fAvMN%
Tengo un objeto llamado DataBase que tiene Una Coleccion Tables, Una
coleccion Views, y una coleecion llamada TableViews que contiene ambos
tipos.
Ambos tipos derivan de la clase TableView.
El objeto DataBase administra las tres coleeciones.
Las coleeciones, son porpiedades publicas de solo lectura del objeto
DataBase.
Es decir, no se puede hacer DataBase.Tables=.
Ni tampoco se puede hacer DataBase.Tables.add

Las Colecciones Tables y Views, le informan a DataBase con un evento
cuando
se agregan o quitan elementos. Y ahi se porcede a hacer lo mismo en la
coleecion TableViews.



Hola.

Sigo sin tenerlo claro.

¿TableViews es una union de Tables y Views, o es una nueva colección que
combina objetos de las dos clases y que podrian estar o no en las otras dos
colecciones?

¿Cómo funciona todo el conjunto, es decir, quién y cómo agrega elementos a
las colecciones?

¿Podrías estar cayendo en una (gran) complicación innecesaria?

Salud!
Respuesta Responder a este mensaje
#9 Eduardo A. Morcillo [MS MVP VB]
15/06/2006 - 02:12 | Informe spam
Me parece que entendimos diferente la pregunta.

obtenemos un error de compilacion diciendo que la resolucion de la
sobrecarga falló porque no hay una Muestra1 que pueda ser llamada sin
una conversión de reducción (narrowing conversion).



Exactamente, si la idea era que el compilador o el CLR diferenciara el tipo
y llamara a una u otra sobrecarga, entonces eso no se puede.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
Respuesta Responder a este mensaje
#10 hugo
15/06/2006 - 17:33 | Informe spam
TableViews, es una vueva coleccion que contiene objetos de ambos tipos.
Mi intención era que al agregar o quitar elementos d elas colecciones Tables
y View, automaticamnete se agreguen a TableViews.
El objeto DataBase tiene un Metodo privado GetTables que llena la coleecion
tables y otro método que llena la colección Views.


"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:OAQ6E7$

"hugo" escribió en el mensaje
news:%23fAvMN%
> Tengo un objeto llamado DataBase que tiene Una Coleccion Tables, Una
> coleccion Views, y una coleecion llamada TableViews que contiene ambos
> tipos.
> Ambos tipos derivan de la clase TableView.
> El objeto DataBase administra las tres coleeciones.
> Las coleeciones, son porpiedades publicas de solo lectura del objeto
> DataBase.
> Es decir, no se puede hacer DataBase.Tables=.
> Ni tampoco se puede hacer DataBase.Tables.add
>
> Las Colecciones Tables y Views, le informan a DataBase con un evento
> cuando
> se agregan o quitan elementos. Y ahi se porcede a hacer lo mismo en la
> coleecion TableViews.

Hola.

Sigo sin tenerlo claro.

¿TableViews es una union de Tables y Views, o es una nueva colección que
combina objetos de las dos clases y que podrian estar o no en las otras


dos
colecciones?

¿Cómo funciona todo el conjunto, es decir, quién y cómo agrega elementos a
las colecciones?

¿Podrías estar cayendo en una (gran) complicación innecesaria?

Salud!




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