Fecha y hora actual: Jueves 17 Ene 2019 04:12
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Curso VB .NET - Tema 1.14 - Clases, datos - VB Studio 2005

Responder al Tema

Índice del Foro > Visual Basic .NET > Curso VB .NET - Tema 1.14 - Clases, datos - VB Studio 2005

Autor Mensaje
Tesis
Administrador


Registrado: 04 Mar 2007
Mensajes: 3200
Ubicación: Valencia - España

Mensaje Publicado: Viernes 23 Ene 2009 16:11

Título del mensaje: Curso VB .NET - Tema 1.14 - Clases, datos - VB Studio 2005

Responder citando

Curso de programación VB .NET - Tema 1.14 - Clases, datos - VB Studio 2005

1. Clases, VB.
1.1 Objetivos del tema.
Se han explicado los conceptos imprescindibles de una clase, métodos y propiedades, ahora tenemos que aplicarlos en este caso en VB.

1.2 Introducción.
Las clases son el molde a partir del cual obtenemos el objeto en nuestro programa, y el objeto es en realidad el que tiene el protagonismo de la acción, la clase es solo el molde.

Vamos a ver como aplicar los conceptos vistos con anterioridad en VB.

1.3 Crear la clase.
Lo ideal es tener un módulo con las o la clase en nuestro proyecto, de forma que estén agrupadas de forma práctica para nosotros.

Elegimos Archivo > Nuevo proyecto y seleccionamos aplicación de consola.

Después Proyecto > Agregar Clase y seleccionamos el icono de clase como vemos en la imagen.



La podemos dejar con el nombre que tiene, o cambiarlo, nosotros la llamaremos ejemplo.

Y ahora a utilizarla.

1.4 El objeto.
Primero creemos el objeto.
Nuestra clase ahora es así.

Código:
Public Class Ejemplo
End Class


Ahora creamos un objeto de esa clase.

Código:
Dim Objeto As Ejemplo


Si ahora escribimos en nuestro programa

Código:
Objeto.


Si vemos la imagen, ese es el resultado, son los métodos estándar de cualquier objeto.



Pero como no hemos escrito nada nuestro, no vemos nada.

1.5 Los datos.
Hemos comentado que eran de dos tipos

    Internos.
    Externos.


Veamos como definir los datos internos en la clase, es decir los que no se ven en el exterior.

Código:
Public Class Ejemplo
Dim DatoInterno As String
Private OtroInterno As Integer
End Class


Si ahora escribimos en nuestro programa

Código:
Dim Objeto as Ejemplo
Objeto.


Si vemos la imagen, ese es el resultado, son los métodos estándar de cualquier objeto.



Exactamente lo mismo que antes, como los datos son internos no se ven fuera de la clase.

Ahora externos, o sea, propiedades.

Código:
Public Class Ejemplo
Dim DatoInterno As String
Private OtroInterno As Integer
Public DatoExterno As String
End Class


Si ahora escribimos en nuestro programa

Código:
Dim Objeto as Ejemplo
Objeto.


Si vemos la imagen, ese es el resultado, son los métodos estándar de cualquier objeto, pero ahora aparece nuestra propiedad, el dato externo.



1.6 Inicializar el objeto.
Para poder utilizar el objeto que hemos creado, éste ha de inicializarse, para ello se utiliza el constructor de la clase.

Para ello existe en Vb el método New, que es el constructor de la clase.

Código:
Sub New(ByVal Dato As String) ' Constructor de la clase
DatoExterno = Dato
End Sub


La misión del constructor no es solo la de asumir los valores que se reciben en el momento de crear el objeto, si no que también se puede hacer en ese momento el control de los mismos.

Código:
Public Sub New(ByVal Dato As String)
If dato <> "" Then DatoExterno = Dato
End Sub


En el ejemplo se obliga a que el dato recibido sea distinto de nulo para asignarlo a la variable de la clase.

La declaración del constructor como public sin argumentos permite la creación de objetos sin la utilización de datos, esto no siempre puede ser práctico o cómodo.

Si en lugar de declarar el constructor como public lo declaramos como private, se impide que se generen instancias de un objeto sin que estos tengan los valores que se reclamen como adecuados en el método.

Código:
Private Sub New() ' impide la creación de instancias de la clase.
End Sub


En el ejemplo que hemos visto, si declaramos como private el constructor anterior, la declaración de un objeto de ésta clase obligaría a que llevará los dos datos que se piden en la sobre carga.

Explicado de otra forma, así se impide que un objeto se cree sin pasar por el control del constructor correspondiente, ya que al declararse como private, éste queda bloqueado, anulado o como deseemos decirlo, y siempre se ejecuta el declarado por nosotros como public.

1.7 Creemos un objeto.
El siguiente paso es crear un objeto de esta clase, aunque ya lo hemos hecho, pero de forma más avanzada.

Código:
Dim Objeto As Ejemplo


Y ahora asignemos algo al dato externo para probarlo.

Código:
Sub Main()
Dim Objeto As Ejemplo
Objeto.DatoExterno = "Contenido de la propiedad"
Console.WriteLine(Objeto.DatoExterno)
Console.ReadKey()
End Sub


No hemos podido utilizarlo, falta un pequeño matiz, hemos definido que el objeto es del tipo Ejemplo, pero no se ha creado una instancia del mismo, cambiemos la forma de definir el objeto por la que sigue.

Código:
Dim Objeto As New Ejemplo


Probemos ahora, y ahora si que funciona, y este sería el resultado.

Código:
Contenido de la propiedad


1.8 Cómo gestionar las propiedades, los datos.
Disponemos de un dato, una propiedad que el usuario puede utilizar, y a nosotros nos permite obtener datos para el funcionamiento del objeto.

Podemos gestionar la obtención de datos de varias formas, podemos:

    Obtener datos en la creación del objeto
    Asignar controladamente los datos
    Asignar sin control previo los datos


1.8.1 Obtener datos en la creación del objeto.
Cuando se crea una instancia de un objeto, se ejecuta de forma predeterminada el método new, tema a parte es que lo hayamos escrito o no.

En ese método nosotros podemos reclamar la inclusión de aquellos datos que creamos oportunos, y en ese mismo momento validarlos.

Código:
Public Class Ejemplo
Dim DatoInterno As String
Private OtroInterno As Integer
Public DatoExterno As String
Sub New(ByVal Dato As String)
  DatoExterno = Dato
End Sub
End Class


Si añadimos el método new a la clase, tal como esta en el ejemplo superior, en el programa habrá que hacer el siguiente cambio,



para evitar el error de sintaxis que podemos observar en la imagen, ya que no se ha introducido el valor que solicitamos en el método new.



Probemos ahora, el código modificado en el programa principal es el que sigue.

Código:
Sub Main()
Dim Objeto As New Ejemplo("Contenido de la propiedad.")
Console.WriteLine(Objeto.DatoExterno)
Console.ReadKey()
End Sub


Ahora si que funciona, y este sería el resultado.

Código:
Contenido de la propiedad.


Fijémonos en que a la propiedad DatoExterno le hemos asignado el valor obtenido en el método New.
Además no se ha realizado ningún control sobre ese dato.
Al método new se le denomina constructor de la clase.

1.8.2 Asignar controladamente los datos.
Se trata de utilizar la sintaxis de propiedad en lugar de la de variable pública.

Al utilizar esta opción, podemos recoger los datos realizando una validación de los mismos antes de asignar el dato a la variable interna nuestra dentro de la clase.

Es decir el dato esta formado por dos componentes:

    La propiedad que es la parte visible.
    La variable interna de la clase, que está oculta.


La captura de los datos es como sigue:
La propiedad dispone de la sintaxis siguiente:

Código:
Property Propiedad() as String
Get ' Lectura
Return DatoInterno
End Get
Set(ByVal value as String) ' Asignación
If value <> "" Then DatoInterno = value
End Set
End Property


Podemos observar que dispone de dos partes, una de lectura, Get, y otra de asignación, Set.

En la de lectura se devuelve el dato de la variable que internamente la representa.

En la de asignación, podemos escribir código de control que comprueba que el valor recibido esté dentro de los márgenes que están previstos.

Código:
Set(ByVal value as String) ' Asignación
If value <> "" Then DatoInterno = value
End Set


Como vemos, en el ejemplo, solo se admite el dato si es distinto de nulo.

De esta forma podemos admitir o no los datos según nos interese.

Es aconsejable que el valor de la variable esté asignado con un valor por defecto en la creación de la variable, de esa forma se cubre cualquier posibilidad y siempre dispondremos de unos valores por defecto.

Código:
Dim DatoInterno As String = "Valor por defecto"


Y si la inicialización del objeto fuera

Código:
Dim Objeto As New Ejemplo("")


Al ejecutarse

Código:
Console.WriteLine(Objeto.Propiedad)


El resultado sería:

Código:
Cambio de contenido


Un ejemplo de su utilización sería:

Código:
Sub Main()
  ' Dim Objeto As New Ejemplo("Contenido de la propiedad")
  Dim Objeto As New Ejemplo("") ‘ se rechaza la inicialización
  Console.WriteLine(Objeto.Propiedad)
  Objeto.Propiedad = "" ‘ Se rechaza
  Console.WriteLine(Objeto.Propiedad)
  Objeto.Propiedad = "Cambio de contenido" ‘ Se admite
  Console.WriteLine(Objeto.Propiedad)
  Console.ReadKey()
End Sub


Podemos seleccionar una de las dos opciones en la inicialización del objeto:

Código:
' Dim Objeto As New Ejemplo("Contenido de la propiedad")
Dim Objeto As New Ejemplo("")


Después podemos observar como se asigna un valor nulo a la propiedad, y que éste se rechaza por no cumplir los requisitos, se visualiza su contenido que no ha sufrido cambios, y después se asigna un valor que sí es válido, y que sí que se visualiza correctamente.

El resultado de la ejecución sería:

Código:
Valor por defecto
Valor por defecto
Cambio de contenido


Y la clase completa sería:

Código:
Public Class Ejemplo
  Dim DatoInterno As String = "Valor por defecto"
  Private OtroInterno As Integer
  Public DatoExterno As String
  Property Propiedad() as String
   Get
     Return DatoInterno
   End Get
   Set(ByVal value as String)
     If value <> "" Then DatoInterno = value
   End Set
  End Property
  Sub New(ByVal Dato As String)
    DatoInterno = Dato
  End Sub
End Class


1.8.3 Asignar sin control previo los datos.
La asignación sin control de los datos puede realizarse tanto en la propiedad, como en la variable.

En la propiedad podemos observar que hemos eliminado el código de validación, y que solo queda la asignación:

Código:
Set(ByVal value as String)
  DatoInterno = value ‘ Asignación
End Set


La propiedad quedaría pues, de esta forma:

Código:
Property Propiedad() as String
 Get
   Return DatoInterno ' Lectura
 End Get
 Set(ByVal value as String)
   DatoInterno = value ' Asignación
 End Set
End Property


La otra posibilidad es la de declarar como variable pública el dato a utilizar y el usuario puede asignar valores de forma libre.

Código:
Public DatoExterno As String


Evidentemente sería adecuado que esa variable fuera inicializada, para de esa forma evitar o reducir problemas.

Código:
Public DatoExterno As String = "Valor por defecto"


Con éste programa

Código:
Sub Main()
 Dim Objeto As New Ejemplo("Contenido de la propiedad")
 Console.WriteLine(Objeto.DatoExterno)
 Objeto.DatoExterno = ""
 Console.WriteLine(Objeto.DatoExterno)
 Objeto.DatoExterno = "Nuevo valor"
 Console.WriteLine(Objeto.DatoExterno)
 Console.ReadKey()
End Sub


La ejecución quedaría como sigue:

Código:
Valor por defecto
Nuevo valor


La línea en blanco es la que provoca ésta instrucción

Código:
Objeto.DatoExterno = ""
Console.WriteLine(Objeto.DatoExterno)


La clase completa de éste ejemplo quedaría:

Código:
Public Class Ejemplo
 Dim DatoInterno As String = "Valor por defecto"
 Private OtroInterno As Integer
 Public DatoExterno As String = "Valor por defecto"
 Property Propiedad() as String
  Get
    Return DatoInterno ' Lectura
  End Get
  Set(ByVal value as String)
    DatoInterno = value ' Asignación
  End Set
 End Property
 Sub New(ByVal Dato As String)
   If Dato <> "" Then DatoInterno = Dato
 End Sub
End Class


1.9 Propiedades solo lectura.
Se trata con ésta opción de disponer solo de la posibilidad de utilizar los valores de una propiedad pero no permitir su modificación por parte del usuario de la clase, del objeto.

Para ello utilizamos la siguiente sintaxis.

Código:
ReadOnly Property Propiedad()
 Get
   Return DatoInterno ' Lectura
 End Get
End Property


Podemos comprobar como desaparece la parte de asignación, Set, y además si intentamos escribirla nos dará error de sintaxis.

1.10 Propiedades solo escritura.
Se trata del caso contrario, permitir que solo pueda asignarse datos pero no su visualización, su lectura.

Código:
WriteOnly Property Propiedad() as String
 Set(ByVal value as String)
   DatoInterno = value ' Asignación
 End Set
End Property


1.11 Utilizar los datos, las propiedades.
El uso de la propiedad es como en el resto de casos en los que utilizamos una variable, con las restricciones expuestas de lectura y escritura, pero no hay cambios, se pueden usar como una variable más.

Precauciones a tomar, tener presente que los cambios en una propiedad, afectan al objeto del cual depende, y si tenemos varios objetos de la misma clase, estar seguros sobre cual hacemos los cambios, o cual es el que estamos utilizando.

1.12 Clase como estructura de datos.
Es posible crear una clase de la que se deriven objetos que únicamente contienen datos, información y también la de crear una estructura válida con la misma.

1.13 Conclusiones.
Hemos visto el uso de los datos en una clase, propiedades, variables públicas, sus condiciones de uso y la forma de controlar los datos.

Lo principal es tener presente que es muy útil declarar las variables inicializadas a valores que sean prácticos para el uso por defecto del objeto.

Pero, además exigir en el método new, el constructor, la inserción de los datos que sean necesarios para la inicialización del objeto.

1.14 Ejercicios propuestos.
1º Crear una clase en la que dispongamos de:
    Una variable privada,
    Una variable pública.
    Una propiedad y su variable interna.
    Una propiedad solo lectura, y su variable interna.
    Una propiedad solo asignación, y su variable interna.

2º A la clase anterior asignar datos a las variables en su declaración.
    Modificar los contenidos de esas variables a través de sus propiedades, realizando un control en función del tipo de dato a introducir.
    Visualizar los contenidos antes y después de los cambios.

3º Añadir a la clase anterior el método new, de forma que se pueda cargar los valores iniciales de las propiedades en el mismo.

1.15 Solución a los ejercicios propuestos.
1º Crear una clase en la que dispongamos de:
    Una variable privada,
    Una variable pública.
    Una propiedad y su variable interna.
    Una propiedad solo lectura, y su variable interna.
    Una propiedad solo asignación, y su variable interna.


Código:
Public Class Ejercicio
 Dim Variable As String = "Valor por defecto"
 Public DatoExterno As String = "Valor por defecto"
 Dim Propie As String
 Dim PropieLectura As Integer
 Dim PropieAsignac As String
 Property Propiedad() as String
  Get
    Return Propie ' Lectura
  End Get
  Set(ByVal value as String)
    Propie = value ' Asignación
  End Set
 End Property
 WriteOnly Property PropiedadAsignacion() as String
 Set(ByVal value as String)
   PropieAsignac = value ' Asignación
 End Set
 End Property
 ReadOnly Property PropiedadLectura() as Integer
  Get
   Return PropieLectura ' Lectura
  End Get
 End Property
End Class


2º A la clase anterior asignar datos a las variables en su declaración.
    Modificar los contenidos de esas variables a través de sus propiedades, realizando un control en función del tipo de dato a introducir.
    Visualizar los contenidos antes y después de los cambios.


Código:
Public Class Ejercicio
 Dim Variable As String = "Valor por defecto"
 Public DatoExterno As String = "Valor por defecto"
 Dim Propie As String = "Valor por defecto"
 Dim PropieLectura As Integer = 3
 Dim PropieAsignac As String = "Valor por defecto"
 Property Propiedad() As String
  Get
   Return Propie ' Lectura
  End Get
  Set(ByVal value As String)
   If value <> "" Then Propie = value ' Asignación
  End Set
 End Property
 WriteOnly Property PropiedadAsignacion() As String
 Set(ByVal value As String)
   If value <> "" Then PropieAsignac = value ' Asignación
 End Set
 End Property
 ReadOnly Property PropiedadLectura() As Integer
  Get
   Return PropieLectura ' Lectura
  End Get
 End Property
End Class


Código:
Module Module1
 Sub Main()
  Dim Objeto As New Ejercicio ' ("Nuevo")
  Console.WriteLine("Antes {0} ", Objeto.DatoExterno)
  Objeto.DatoExterno = "Nuevo dato"
  Console.WriteLine("Después {0} ", Objeto.DatoExterno)
  Console.WriteLine("Antes {0} ", Objeto.Propiedad)
  Objeto.Propiedad = "Nuevo valor"
  Console.WriteLine("Después {0} ", Objeto.Propiedad)
  Console.WriteLine("Antes {0} ", Objeto.PropiedadLectura)
  ' no se puede asignar es read only, solo lectura
  ' Objeto.PropiedadLectura = 25
  Console.WriteLine("Después {0} ", Objeto.PropiedadLectura)
  ' no se puede leer es write Only
  ' Console.WriteLine("Antes {0} ", Objeto.PropiedadAsignacion)
  Objeto.PropiedadAsignacion = "Nuevo valor"
  ' no se puede leer es write Only
  ' Console.WriteLine("Después {0} ", Objeto.PropiedadAsignacion)
  Console.ReadKey()
 End Sub
End Module


3º Añadir a la clase anterior el método new, de forma que se pueda cargar los valores iniciales de las propiedades en el mismo.

Código:
Public Class Ejercicio
 Dim Variable As String = "Valor por defecto"
 Public DatoExterno As String = "Valor por defecto"
 Dim Propie As String = "Valor por defecto"
 Dim PropieLectura As Integer = 3
 Dim PropieAsignac As String = "Valor por defecto"
 Property Propiedad() As String
  Get
   Return Propie ' Lectura
  End Get
  Set(ByVal value As String)
   If value <> "" Then Propie = value ' Asignación
  End Set
 End Property
 WriteOnly Property PropiedadAsignacion() As String
  Set(ByVal value As String)
    If value <> "" Then PropieAsignac = value ' Asignación
  End Set
 End Property
 ReadOnly Property PropiedadLectura() As Integer
  Get
   Return PropieLectura ' Lectura
  End Get
 End Property

 Sub New(ByVal Prop As String, ByVal PropLec As Integer, ByVal PropAsig As String)

   If Prop <> "" Then Propie = Prop
   If PropLec <> 0 Then PropieLectura = PropLec
   If PropAsig <> "" Then PropieAsignac = PropAsig
 End Sub
End Class


Código:
Module Module1
 Sub Main()
   Dim Objeto As New Ejercicio("Valor prop en new", 23, "Valor PropAsig en New")
   Console.WriteLine("Antes {0} ", Objeto.DatoExterno)
   Objeto.DatoExterno = "Nuevo dato"
   Console.WriteLine("Después {0} ", Objeto.DatoExterno)
   Console.WriteLine("Antes {0} ", Objeto.Propiedad)
   Objeto.Propiedad = "Nuevo valor"
   Console.WriteLine("Después {0} ", Objeto.Propiedad)
   Console.WriteLine("Antes {0} ", Objeto.PropiedadLectura)
   ' no se puede asignar es read only, solo lectura
   ' Objeto.PropiedadLectura = 25
   Console.WriteLine("Después {0} ", Objeto.PropiedadLectura)
   ' no se puede leer es write Only
   ' Console.WriteLine("Antes {0} ", Objeto.PropiedadAsignacion)
   Objeto.PropiedadAsignacion = "Nuevo valor"
   ' no se puede leer es write Only
   ' Console.WriteLine("Después {0} ", Objeto.PropiedadAsignacion)
   Console.ReadKey()
 End Sub
End Module


Observar como en la ejecución no se modifica el valor de la propiedad solo lectura.

Autor del curso: casiopea


Normas del foro
Aprende a postear correctamente usando las etiquetas
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

AYUDA CON LOGEO Y BASE DE DATOS

gonzaloramirez PHP 1 Domingo 28 Oct 2018 03:29 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Base Datos Access Problemas Conexion/Reporte

ce_1187@hotmail.com Visual Basic .NET 0 Jueves 27 Sep 2018 22:31 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Cursos de programacion y base de datos

Alexweb ASP, ASP.NET 1 Jueves 31 May 2018 16:59 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Dudas al instanciar clases heredadas

MMCA Java 0 Viernes 26 Ene 2018 21:34 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Problema para extracción de datos utilizando py...

liz Python 1 Viernes 06 Oct 2017 11:05 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,