Polimorfismo

09/11/2004 - 17:20 por JoseM | Informe spam
Saludos amigos,

PRimero gracias por todas las ayudas y atencion prestada
anteriormente.
Tengo un problemilla con la forma de heredar de una clase
base, como puedo hacer para tener algo asi como una clase
abstracta parecida a Object, que permita que sus hijos
sean recibidos en funciones con su tipo.
Antes tenia:
Public Function GeneraEvents(ByVal ctrldata As ObjectData,
ByVal codev As Integer)
DBL.AddParameter("@Z1779", ctrldata.tipoprm,
ctrldata.sizeprm, ctrldata.idcolum)




Pasa que tipoprm es miembro de una clase llamada
textObjectData que hereda solo un atributo de Objectdata y
me manda un error que dice justamente eso que tipoprm no
pertenece a Objectdata, cosa q cambia si lo recibo como
object por ejemplo.

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
09/11/2004 - 20:16 | Informe spam
Si le pasas un objeto de tipo ObjectData a la funcion solo deberias usar los
metodos que esta clase expone. Esto no significa que no puedas, de ser
necesario, usar metodo usar metodos de subclases o de interfaces
implementadas por el objeto, pero esto debe ser algo que no impida la
ejecucion normal del metodo.

Te funciona con Object porque no estas usando Option Strict On (que deberia
usarse siempre) y entonces la llamada se hace mediante reflection (lo cual
es poco eficiente ya que requiere de muchas comprobaciones hechas en tiempo
de ejecucion).

Las soluciones son varias y dependen de la operacion que realice el metodo.
Por ejemplo:

* Mover tipoprm a la clase ObjectData y entonces hacer la llamada
directamente.
* Chequear si el objeto pasado es de un tipo dado y si lo es realizar un
cast a una variable de ese tipo y realizar la operacion (esto no deberia
afectar la ejecucion del metodo si el objeto no es del tipo).
* Poner los metodos y propiedades usados por el metodo en una interfaz, usar
esa interfaz como parametro del metodo (en lugar de la clase ObjectData) e
implementar esa interface en los objetos.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
#2 Luis Cisneros
09/11/2004 - 20:42 | Informe spam
Hola!

a ver si te entendi:

Public MustInherit Class Padre

Public Atributo As Integer 'es recomendable encapsular, pero bueno...

Public Sub HacerAlgo()
MsgBox("Padre:HacerAlgo")
End Sub

Public MustOverride Sub hacerotracosa()

Public Overloads Function retornarlAlgo() As Int16
Return 10
End Function

Public Overloads Function retornarlAlgo(ByVal Int As Integer) As Int16
Return Int * 5
End Function

End Class

Public Class hijo1
Inherits Padre

Public Overrides Sub hacerotracosa()
MsgBox("hacerotracosa:Hijo1")
End Sub
End Class

Public Class hijo2
Inherits Padre

Public Overrides Sub hacerotracosa()
MsgBox("hacerotracosa:Hijo2")
End Sub

Public Sub hagoUnaTercerCosa()
MsgBox("hagoUnaTercerCosa:hijo2")
End Sub
End Class

Public Class correr
Public Shared Sub main()

Dim mHijo1 As New hijo1
Dim mHijo2 As New hijo2
Dim mHijo3 As Padre = New hijo1

haceralgoconObjetos(mHijo1)
haceralgoconObjetos(mHijo2)
haceralgoconObjetos(mHijo2)

End Sub

Public Shared Sub haceralgoconObjetos(ByVal mipadre As Padre)

mipadre.HacerAlgo()
mipadre.hacerotracosa()

If TypeOf (mipadre) Is hijo2 Then
DirectCast(mipadre, hijo2).hagoUnaTercerCosa()
End If

End Sub
End Class

Espero que el ejemplo te sirva de algo

Saludos
Luis Cisneros
"JoseM" wrote:

Saludos amigos,

PRimero gracias por todas las ayudas y atencion prestada
anteriormente.
Tengo un problemilla con la forma de heredar de una clase
base, como puedo hacer para tener algo asi como una clase
abstracta parecida a Object, que permita que sus hijos
sean recibidos en funciones con su tipo.
Antes tenia:
Public Function GeneraEvents(ByVal ctrldata As ObjectData,
ByVal codev As Integer)
DBL.AddParameter("@Z1779", ctrldata.tipoprm,
ctrldata.sizeprm, ctrldata.idcolum)
>
Pasa que tipoprm es miembro de una clase llamada
textObjectData que hereda solo un atributo de Objectdata y
me manda un error que dice justamente eso que tipoprm no
pertenece a Objectdata, cosa q cambia si lo recibo como
object por ejemplo.


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