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
 

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!

Preguntas similares