sigo con strict on

17/09/2005 - 06:28 por Juan Melas | Informe spam
Sigo intentando con el strict on y me encuentro con el siguiente problema.
De acuerdo a un ejemplo que me dio Eduardo Morcillo cree una clase base que
hereda de mi clase de negocios con un sólo método(getmovimientos) que es
común para todas las clases, luego hice que todas mis clases de usuario
hereden de dicha clase, puse en la clase base de formulario una variable con
el tipo de la clase base y una llamada al método de la clase base, en el
formulario heredado asigno dicha variable a la clase de usuario, pero en
lugar de ejectuar el método de dicha clase ejecuta el de la clase base ,
abajo extracte los fragmentos de código de las clases y del formulario.
Hasta ahora declaraba en el formulario base la variable buisobj como object
y en cada formulario la asignaba a la clase de usuario correspondiente y me
ejecutaba el método de dicha clase (getmovimientos)


Public MustInherit Class buisobj
Inherits BusinessObject
Public MustOverride Function getmovimientos(ByVal idclave As Object) As
DataSet
End Class

Public Class Proveedores
Inherits Business.buisobj
Public Sub New()
Me.TableName = "Proveedores"
Me.TablaPrimaria = "Proveedores"
End Sub
Protected Overloads Function Getmovimientos(ByVal lnIdProvee As Integer) As
DataSet
Return Me.GetDataSet("select * from " & Me.TableName & " where idprovee=" &
lnIdProvee.ToString)
End Function
End Class



Public Class Form1
Inherits System.Windows.Forms.Form
Public ds As New DataSet
Protected buisobj As Business.buisobj
sub buscar()
ds = buisobj.GetMovimientos(idtabla)
end sub

Public Class FrmProvee
Inherits Frombase.Form1
Dim ocondiva As New Condiva
Dim dscondiva As New DataSet
#Region " Código generado por el Diseñador de Windows Forms "
Public Sub New()
MyBase.New()
buisobj = New Proveedores
'El Diseñador de Windows Forms requiere esta llamada.
InitializeComponent()
'Agregar cualquier inicialización después de la llamada a
InitializeComponent()
End Sub


La forma correcta de hacerlo seria que las clases que guardas en la variable
Object implementen una misma interface o que hereden de una misma clase. En
esta interface o clase pondrias todo lo que sea comun y uses en el
formulario base. Luego en el formulario en lugar de declarar la variable
como object la declaras del tipo de la clase o interface. En los formularios
heredados haces un cast cuando necesites usar algun miembro de la clase
heredada (o puedes tener una referencia a nivel de clase). Un ejemplo:

Class Persona

Public Nombre As String
Public Apellido As String

End Class

Class Empleado
Inherits Persona

Public FechaDeIngreso As Date
Public Cargo As String

End Class

Class FormularioEdicionPersona
Inherits System.Windows.Forms.Form

Protected persona As Persona

' ...

Sub HacerAlgo()
persona.Nombre = txtNombre.Text
End Sub

End Class

Class FormularioEdicionEmpleado
Inherits FormularioEdicionPersona

Sub New() {
persona = New Empleado();
}

Sub HacerAlgoMas()
DirectCast(persona, Empleado).Cargo = txtCargo.Text
End Sub

End Class

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C

Preguntas similare

Leer las respuestas

#1 Leonardo Azpurua [mvp vb]
17/09/2005 - 16:05 | Informe spam
"Juan Melas" escribió en el mensaje
news:
Sigo intentando con el strict on y me encuentro con el siguiente problema.
De acuerdo a un ejemplo que me dio Eduardo Morcillo cree una clase base
que hereda de mi clase de negocios con un sólo método(getmovimientos) que
es común para todas las clases, luego hice que todas mis clases de usuario
hereden de dicha clase, puse en la clase base de formulario una variable
con el tipo de la clase base y una llamada al método de la clase base, en
el formulario heredado asigno dicha variable a la clase de usuario, pero
en lugar de ejectuar el método de dicha clase ejecuta el de la clase base
, abajo extracte los fragmentos de código de las clases y del formulario.
Hasta ahora declaraba en el formulario base la variable buisobj como
object y en cada formulario la asignaba a la clase de usuario
correspondiente y me ejecutaba el método de dicha clase (getmovimientos)



Hola.

No entiendo: si Proveedores hereda de buisObj, y en buisObj el metodo
GetMovimientos está declarado como MustOverride ¿qué método de qué clase
base, se ejecuta al activar FrmProvee.Buscar()?

buisObj no proporciona ninguna funcionalidad para GetMovimientos.

En Proveedores no deberias declararla como "Overloads" (mi VB 2003 lo
rechaza), sino como "Overrides".

En frmProvee, prueba a asignarle a buisObj *despues* de la llamada a
InitializeComponent. No recuerdo bajo qué circunstancias, alguna vez tuve
problemas creando objetos en el New generado por el diseñador y tuve que
mover las instanciaciones a Load.

Pero en esencia, el código que muestras debería trabajar.

Salud!
Respuesta Responder a este mensaje
#2 Juan Melas
17/09/2005 - 18:18 | Informe spam
Como lo tengo ahora con strict off en la clase base de formulario
instancio la clase en el load del formulario heredado y el método
getmovimientos está en cada clase (clientes,proveedores,etc) y no en la
clase base buisnessobject, para hacerlo con strict on puse una clase
intermedia ,buisobj que hereda de buisnessobject, le puse el método
getmovimientos como mustinherit ya que en cada clase va a cambiar según las
tablas que use y finalmente lo declaro como overloads porque modifico el
tipo de parámetro , en algunos caso es integer y en otros string, en la
clase base de formulario hago un buisobj.getmovimientos que con strict off
va a la clase correspondiente y ejectua dicha función con strict on va a la
clase base buisobj y como la función getmovimientos no está implementada
sino que la implemento en cada clase heredada no me trae el dataset,

Espero me hayas entendido y gracias por tu colaboración

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

"Juan Melas" escribió en el mensaje
news:
Sigo intentando con el strict on y me encuentro con el siguiente
problema.
De acuerdo a un ejemplo que me dio Eduardo Morcillo cree una clase base
que hereda de mi clase de negocios con un sólo método(getmovimientos) que
es común para todas las clases, luego hice que todas mis clases de
usuario hereden de dicha clase, puse en la clase base de formulario una
variable con el tipo de la clase base y una llamada al método de la clase
base, en el formulario heredado asigno dicha variable a la clase de
usuario, pero en lugar de ejectuar el método de dicha clase ejecuta el de
la clase base , abajo extracte los fragmentos de código de las clases y
del formulario.
Hasta ahora declaraba en el formulario base la variable buisobj como
object y en cada formulario la asignaba a la clase de usuario
correspondiente y me ejecutaba el método de dicha clase (getmovimientos)



Hola.

No entiendo: si Proveedores hereda de buisObj, y en buisObj el metodo
GetMovimientos está declarado como MustOverride ¿qué método de qué clase
base, se ejecuta al activar FrmProvee.Buscar()?

buisObj no proporciona ninguna funcionalidad para GetMovimientos.

En Proveedores no deberias declararla como "Overloads" (mi VB 2003 lo
rechaza), sino como "Overrides".

En frmProvee, prueba a asignarle a buisObj *despues* de la llamada a
InitializeComponent. No recuerdo bajo qué circunstancias, alguna vez tuve
problemas creando objetos en el New generado por el diseñador y tuve que
mover las instanciaciones a Load.

Pero en esencia, el código que muestras debería trabajar.

Salud!


Respuesta Responder a este mensaje
#3 Eduardo A. Morcillo [MS MVP VB]
17/09/2005 - 18:49 | Informe spam
El problema es que debes sobreescribir el metodo de la clase base y no crear
otro con diferentes parametos. Siguiendo tu codigo seria algo asi:

Public MustInherit Class buisobj
Inherits BusinessObject

Public MustOverride Function GetMovimientos(ByVal idclave As Object) As
DataSet

End Class

Public Class Proveedores
Inherits Business.buisobj

' ...

Protected Overrides Function GetMovimientos(ByVal idClave As Object) As
DataSet

' Checkeo que idClave sea del tipo correcto para esta clase
If Not TypeOf idClave Is Integer Then Throw New ArgumentException()

Dim id As Integer = DirectCast(idClave, Integer)

Return Me.GetDataSet("select * from " & Me.TableName & " where
idprovee=" & id.ToString)

End Function

End Class

Otra posibilidad es que crees metodos para cada tipo de datos:

Public MustInherit Class buisobj
Inherits BusinessObject

Public MustOverride Function GetMovimientos(ByVal idclave As Integer) As
DataSet

Public MustOverride Function GetMovimientos(ByVal idclave As String) As
DataSet

End Class

Y en las otras clases implementas la que necesitas y generas una excepcion
en las que no necesitas:

Public Class Proveedores
Inherits Business.buisobj


' ...

Protected Overrides Function GetMovimientos(ByVal idClave As String) As
DataSet

Throw New NotImplementedException()

End Function

Protected Overrides Function GetMovimientos(ByVal idClave As Integer) As
DataSet

Return Me.GetDataSet("select * from " & Me.TableName & " where
idprovee=" & idClave.ToString)


End Function

End Class

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
Respuesta Responder a este mensaje
#4 Juan Melas
18/09/2005 - 07:21 | Informe spam
Gracias Eduardo, ahora parece que funciona.

"Eduardo A. Morcillo [MS MVP VB]" <emorcillo .AT. mvps.org> escribió en el
mensaje news:
El problema es que debes sobreescribir el metodo de la clase base y no
crear otro con diferentes parametos. Siguiendo tu codigo seria algo asi:

Public MustInherit Class buisobj
Inherits BusinessObject

Public MustOverride Function GetMovimientos(ByVal idclave As Object) As
DataSet

End Class

Public Class Proveedores
Inherits Business.buisobj

' ...

Protected Overrides Function GetMovimientos(ByVal idClave As Object) As
DataSet

' Checkeo que idClave sea del tipo correcto para esta clase
If Not TypeOf idClave Is Integer Then Throw New ArgumentException()

Dim id As Integer = DirectCast(idClave, Integer)

Return Me.GetDataSet("select * from " & Me.TableName & " where
idprovee=" & id.ToString)

End Function

End Class

Otra posibilidad es que crees metodos para cada tipo de datos:

Public MustInherit Class buisobj
Inherits BusinessObject

Public MustOverride Function GetMovimientos(ByVal idclave As Integer)
As DataSet

Public MustOverride Function GetMovimientos(ByVal idclave As String) As
DataSet

End Class

Y en las otras clases implementas la que necesitas y generas una excepcion
en las que no necesitas:

Public Class Proveedores
Inherits Business.buisobj


' ...

Protected Overrides Function GetMovimientos(ByVal idClave As String) As
DataSet

Throw New NotImplementedException()

End Function

Protected Overrides Function GetMovimientos(ByVal idClave As Integer)
As DataSet

Return Me.GetDataSet("select * from " & Me.TableName & " where
idprovee=" & idClave.ToString)


End Function

End Class

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C

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