lunes, 8 de julio de 2013

Visual Basic .NET: Crear campos y propiedades


En este articulo aprenderemos a programar en VB.NET una clase con campos y propiedades, también aprenderemos a:

Crear una propiedad de sólo lectura.

Crear una propiedad que toma un parámetro.

Usar un array de instancias de clase como fuente de un control DataGrid.

Las propiedades contienen las características de los objetos a los que pertenecen. Por ejemplo la clase coche tiene la propiedad color para indicar el color del coche. O una caja de texto tiene las propiedades alto y ancho que especifica sus dimensiones en la pantalla.

Existe también una interacción entre las propiedades de una clase y el comportamiento del objeto. Al mover una caja de texto (un comportamiento) cambia su ubicación (una propiedad). Veremos este modelo en varias ocasiones en el diseño orientado a objetos.


Se va a crear una propiedad de sólo lectura. Se le creará una propiedad que toma un parámetro, lo que hará que se comporte, en algunos aspectos, como una función.

También vamos a crear e inicializar una matriz de instancias de clase y luego usaremos esa matriz como una fuente de datos en un data grid. Visual Studio. NET, reconoce las propiedades de la definición de la clase y convierte los títulos de las columnas.


Consideraciones de Diseño para las Propiedades



Para diseñar e implementar las propiedades hay que tener en cuenta las siguientes consideraciones:

-Usar una propiedad de sólo lectura cuando la propiedad este totalmente determinada por otras propiedades. Por ejemplo, en una clase prisma, las propiedades alto, ancho y largo pueden ser de lectura y escritura, pero la propiedad volumen sería de sólo lectura.

-Las propiedades pueden ser de lectura y escritura, de sólo lectura o sólo escritura. Una propiedad de lectura y escritura se puede recuperar y establecer por el código de cliente. Una propiedad de sólo lectura sólo se puede recuperar y una propiedad de sólo escritura sólo puede se establecida.

Las propiedades de sólo escritura son poco frecuentes. Los desarrolladores tienden a utilizar propiedades de sólo escritura para enviar datos a dispositivos de hardware, por lo que el valor que se envía al dispositivo no se puede recuperar más tarde.

-Un getter o captador (la parte de lectura de una definición de propiedad) y setter (la parte de escritura de una definición de propiedad) de una propiedad son los métodos conceptualmente simples que devuelven o establecen los valores. Una propiedad Radio de un objeto círculo se puede sustituir fácilmente a la propiedad
GetRadio. La ventaja de utilizar una propiedad, es la sintaxis. Circulo.Radio = 15 es obviamente más elegante que Circulo.GetRadio (15).

- Diseñar propiedades de manera que puedan ser cambiadas independientemente y en cualquier orden. Si las propiedades son dependientes, usar un método para establecerlas. Por ejemplo, si es necesario establecer la propiedad Apellido de un objeto Persona antes de configurar el Nombre de la propiedad, usar una función
PonerNombreApellido en lugar de dos propiedades.

-La lectura del valor de una propiedad no tiene efectos secundarios, en ninguna otra instancia los datos deben cambiar simplemente porque se recupera un valor de la propiedad. Por ejemplo, un desarrollador no esperaría que la propiedad ancho de un objeto prisma
cambie simplemente porque se lea la propiedad volumen.


Crear propiedades de sólo-lectura


Por ejemplo, para que la propiedad Nombre del proyecto de ejemplo sea de sólo lectura bastaría con poner la palabra ReadOnly delante de Property y poner sólo la parte Get de la propiedad eliminando si existiera la parte Set de la propiedad, quedando esta así:

Public ReadOnly Property Nombre() As String
Get
Return m_nombre
End Get
'Set(ByVal value As String)
m_nombre = value
'End Set
End Property



Crear una propiedad que toma un parámetro (lectura de un array)




Para ello la propiedad se declara igual que una cualquiera, basta con introducir el indice como parámetro. Si queremos crear una propiedad que nos devuelva un sólo hospital del array de clases hospital (por ejemplo que nos devuelva el nombre):

Private m_hospitales() As String
Public Property NombreArr(ByVal index As Integer) As String
Get
Return m_hospitales(index)
End Get
Set(ByVal Value As String)
ReDim Preserve m_hospitales(index)
m_hospitales(index) = Value
End Set
End Property


El código para utilizar dicha propiedad desde un formulario sería de este tipo.

Dim Nombre_Hospital As String
m_hospitales(i).NombreArr(i) = dt.Rows(i).Item(2) 'llama a Set para poner el Nombre a partir de un DataTable dt previamente cargado
Nombre_Hospital = m_hospitales(i).NombreArr(i) 'llama a Get para leer el Nombre


Este código nos da una forma de examinar el nombre de cada hospital, en caso de que queramos crear una interfaz de usuario. Si queremos usar un indexador que permita iterar a través de la colección privada de objetos de la clase CHospital utilizando un índice integer, probablemente deseemos iterar a través de colecciones utilizando la estructura de control For Each. Debido a que el array m_hospitales es privado en la clase, no está disponible para la iteración en el código de cliente.

Como el valor devuelto por m_hospitales(index) es un objeto System.Object. Debemos
convertir este objeto en el tipo CHospital para acceder a las propiedades.



Conectar un Datagrid a un array de instancias de la clase




Con este código, se asigna un dataSet a un DataGrid, El DataGrid muestra lo que se cargó en el dataSet cargado a su vez con la SELECT.

Dim CadConexion As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim CadConexion As String
Dim ds As New DataSet()

CadConexion = "User ID=sa;Initial Catalog=model;Data Source=SRV-SERVIDOR\INSTANCIA;Password=adfrexx23"
Conexion.conectar(CadConexion)
Dim daDB As New SqlClient.SqlDataAdapter("Select * From dbo.tbHospital", Conexion.cnDB)
daDB.MissingSchemaAction = MissingSchemaAction.AddWithKey
daDB.FillSchema(ds, SchemaType.Source, "Cust")
daDB.Fill(ds, "Cust")
DataGridView1.DataSource = ds
DataGridView1.DataMember = "Cust"
End Sub


Visual Basic .NET: Crear campos y propiedades

A continuación, prescindimos del DataSet y cargamos el DataGrid directamente desde un array de instancias de la clase cargado justo antes.

Dim CadConexion As String
Dim m_hospitales() As CHospital
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'se crea un array de objetos de la clase CHospital
ReDim Preserve m_hospitales(0)
Dim m_hospital As CHospital = New CHospital
'Conexión a la base de datos
Dim dt As New DataTable
CadConexion = "User ID=sa;Initial Catalog=model;Data source=SRV-SERVIDOR\INSTANCIA;Password=adfrexx23"
Conexion.conectar(CadConexion)
Dim daDB As New SqlClient.SqlDataAdapter("SELECT * FROM dbo.tbHospital", Conexion.cnDB)
Dim i As Integer
daDB.Fill(dt)
i = dt.Rows.Count
'Este for carga un array de Objetos CHospital con los valores de la select
For i = 0 To dt.Rows.Count - 1
ReDim Preserve m_hospitales(i)
m_hospitales(i) = New CHospital()
m_hospitales(i).Codigo = dt.Rows(i).Item(1) m_hospitales(i).Nombre = dt.Rows(i).Item(2) m_hospitales(i).Direccion = dt.Rows(i).Item(3
Next
'Este bloque rellena un datgrid
daDB.MissingSchemaAction = MissingSchemaAction.AddWithKey
daDB.FillSchema(ds, SchemaType.Source, "Cust")
daDB.Fill(ds, "Cust")
DataGridView1.DataSource = m_hospitales
End Sub


En este caso se muestran todos los campos del objeto, pero el array sólo rellena los que traen datos.

Visual Basic .NET: Crear campos y propiedades

Resumen


Crear una propiedad de sólo lectura

Public ReadOnly Property Name() As String
Get
Return m_nombre
End Get
End Property


Crear una propiedad de sólo escritura

Public WriteOnly Property Name() As String
Set(ByVal Value As String)
m_nombre = value
End Set
End Property


Crear una propiedad que toma un parámetro


Public Property NombreArr(ByVal index As Integer) As String
Get
Return m_hospitales(index)
End Get
Set(ByVal Value As String)
ReDim Preserve m_hospitales(index)
m_hospitales(index) = Value
End Set
End Property


Usar un array de instancias de una clase y poner como dataSource de un control DataGrid

Private m_sourceFiles(MaxFiles) As SourceFile
listOfFiles.DataSource = m_sourceFiles









 

No hay comentarios:

Publicar un comentario