SlideShare una empresa de Scribd logo
1 de 41
Descargar para leer sin conexión
119
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
6.- PROGRAMACIÓN ORIENTADA A OBJETOS (POO) DE VISUAL BASIC.NET
Introducción:
Todo .NET Framework está basado en clases (u objetos). A diferencia de las versiones
anteriores de Visual Basic, la versión .NET de este lenguaje basa su funcionamiento casi
exclusivamente en las clases contenidas en .NET Framework, además casi sin ningún
tipo de limitación.
La POO es una evolución de la programación por procedimientos llamada también
estructurada. Se basaba en funciones y procedimientos y el código que controlaba el
flujo de las llamadas a estos. En Visual Basic, sobre todo en versiones anteriores se
sigue programando mucho así. A veces por desconocimiento y otras por "miedo" no se
da el salto a la POO, aunque un programador con experiencia en VB puede hacer
magníficas aplicaciones sin utilizar la POO (y sin aprovecharse de sus ventajas), y sobre
todo, en un tiempo relativamente reducido.
6.1.-¿Qué es una clase?
Los programas de Visual Basic se generan con objetos como formularios y controles.
Los objetos también se pueden utilizar para representar cosas reales como personas,
equipos informáticos o incluso algo más abstracto, como una cuenta bancaria.
Una clase es simplemente una representación de un tipo de objeto. Se puede pensar
en ella como un plano que describe el objeto. Así como un plano puede utilizarse para
construir varios edificios, una clase podemos usarla para crear varias copias de un
objeto.
Por ejemplo, el control TextBox lo define una clase TextBox, que define su aspecto y
sus funciones. Cada vez que arrastramos un control TextBox a un formulario,
realmente está creando una nueva instancia de la clase TextBox.
Cada control TextBox es una copia exacta, aunque distinta, de la clase que lo define, la
clase TextBox. Puesto que cada objeto es una "instancia" independiente de una clase,
la acción de crear una clase se denomina creación de instancias.
Hasta ahora hemos agregado los controles TextBox a su formulario arrastrándolos
desde el Cuadro de herramientas, pero también puede crear instancias de un objeto
TextBox en su código si utiliza la palabra clave New.
Dim Textbox1 As New TextBox
¿Qué hay dentro de una clase?
Todos los objetos tienen propiedades que describen sus atributos, métodos que
definen sus acciones y eventos que definen sus respuestas. Igualmente, la clase que
120
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
define un objeto tiene sus propias propiedades, métodos y eventos (a veces llamados
miembros) que se pasan a todas las instancias de esa clase.
Por ejemplo, una clase que representa una cuenta bancaria podría tener propiedades
como:
NumeroCuenta
BalanceCuenta
Métodos como:
CalculaInteres ()
Eventos :
CambioBalance.
Una vez creada la instancia de un objeto de cuenta bancaria, puede tener acceso a sus
propiedades, métodos y eventos de igual manera que si se tratara de un objeto
TextBox.
Algunos miembros de una clase son privados; sólo se tiene acceso a ellos mediante
código dentro de la clase. Por ejemplo, una clase de cuenta bancaria puede tener un
método para calcular un saldo. Lo lógico es permitir que un programa lea ese balance
pero no que pueda cambiarlo directamente.
Puede ocultar los miembros de una clase si los declara como Private o exponerlos si
los declara como Public. También puede permitir el acceso a una propiedad y a la vez
impedir que el programa cambie su valor declarándolo como ReadOnly.
El código siguiente muestra cómo podría ser una clase CuentaBanco, por ejemplo:
'Declaramos la clase CuentaLimpia
Class CuentaLimpia
'La hacemos privada
Private NumeroCuenta As String
Private BalanceCuenta As Decimal
'Y la ponemos publica para que calcule el balance
Public Sub ActualizaBalance()
End Sub
ReadOnly Property Balance() As Decimal
Get
Return BalanceCuenta
End Get
End Property
End Class
CtaBancaria
NumeroCuenta
BalanceCuenta
CalculaInteres()
CambioBalance
Hacer click
121
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
6.2.- Crear la primera clase
Una de las mejores razones para utilizar clases es que una vez que ha creado una clase
para cierto tipo de objeto, se puede reutilizar esa clase en cualquier proyecto.
Por ejemplo, muchos de los programas que escribimos pueden involucrar personas: Un
programa de administrador de contactos para los contactos comerciales o un
programa para realizar un seguimiento de empleados. Aunque los programas pueden
ser considerablemente diferentes, los atributos que se aplican a cada persona serían
los mismos. Todas tienen nombre, edad, dirección, número de teléfono, etc.
Para empezar a ver mejor crear clases,y usarlas crearemos una clase que represente a
una persona; Podemos guardar esta clase y utilizarla en otros programas que
escribamos en el futuro.
Las clases se pueden crear de tres maneras: como parte del código en un módulo de
formulario en un proyecto de aplicación para Windows, como un módulo de clase
separado agregado a un proyecto de aplicación para Windows o como un proyecto de
bibliotecas de clase independiente.
Crear clases
Al hacer doble clic en un formulario y abrir el Editor de código se ve algo parecido a lo
siguiente:
Public Class Form1
Private Sub Form1_Load...
…
End Sub
End Class
Podemos observar que el formulario realmente es una clase, marcada por
instrucciones Class y End Class y cualquier código que se haya escrito entre las dos
instrucciones es parte de la clase. Aunque de manera predeterminada un módulo de
formulario contiene sólo una clase única, puede crear módulos adicionales agregando
código debajo de la instrucción End Class, tal como se ilustra a continuación:
Public Class Form1
' El código de vuestro Form AQUI
End Class
Public Class MyFirstClass
' El código de vuestra clase AQUI
End Class
La desventaja de crear clases de esta manera es que sólo están disponibles dentro del
proyecto donde se crearon. Si deseamos compartir una clase con otros proyectos,
puede colocarla en un módulo de clase.
122
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Módulos de clase
Un módulo de clase es un archivo de código, separado del resto, que contiene una o
más clases. Como es un archivo independiente, se puede reutilizar en otros proyectos.
Los módulos de clase se pueden crear de dos maneras:
Como un módulo agregado a un proyecto de aplicación para Windows.
Como un proyecto de bibliotecas de clase independient
Puede agregar un nuevo módulo de clase a un proyecto existente seleccionando Clase
en el cuadro de diálogo Agregar nuevo elemento, disponible en el menú Proyecto. Para
trabajar en durante el tutorial, crearemos un proyecto de bibliotecas de clases
independientes.
Vamos a ver cómo crear un proyecto de de biblioteca de clases:
En el menú Archivo, seleccionamos Nuevo proyecto.
En el panel Plantillas, del cuadro de diálogo Nuevo proyecto, hacemos clic en
Biblioteca de clases.
En el cuadro Nombre, escribimos Persons y hacemos clic en Aceptar.
Se abrirá un nuevo proyecto de bibliotecas de clase y el Editor de código
mostrará el módulo de clase Class1.vb.
123
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
En el Explorador de soluciones, hacemos clic con el botón secundario del ratón
en Class1.vb y seleccionamos Cambiar nombre y, a continuación, cambiamos el
nombre a "Persons.vb".
Observamos que el nombre en el Editor de código también cambia a
Persons.vb.
En el menú Archivo, elegimos Guardar todo.
En el cuadro de diálogo Guardar proyecto, hacemos clic en Guardar.
Nota: En lugar de guardar el proyecto en la ubicación predeterminada, podríamos
crear un directorio en el cual podemos almacenar todas las clases para reutilizarlas
mas tarde. se puede especificar esa carpeta en el campo Location del cuadro de
diálogo Guardar proyecto antes de guardar.
De momento, mantendremos el proyecto abierto, porque lo utilizaremos durante todo
el tutorial, e iremos ampliando la información.
Agregar propiedades a una clase
Ahora, aprenderemos a agregar propiedades a la clase que creamos en la sección
anterior.
Todos los objetos tienen atributos y las propiedades representan atributos. Antes,
hicimos la clase "Persons", que representa a una persona; las personas tienen
atributos como el nombre y la edad, por lo que la clase Persons necesita propiedades
que representen dichos atributos.
Se pueden agregar propiedades a una clase de dos maneras:
124
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Como campo.
Como procedimiento de propiedad.
También podemos determinar cómo funciona una propiedad utilizando los
modificadores Public, ReadOnly o WriteOnly.
Campos y procedimientos de propiedad
Los campos son variables públicas dentro de una clase que se pueden establecer o leer
desde fuera de la clase. Resultan de utilidad para propiedades que no se tienen que
validar, por ejemplo, un valor "Boolean" (True o False).
En el caso de la clase Personas, se puede tener una propiedad Boolean denominada
Casado, que especifica si una persona está soltera o casada, puesto que hay sólo dos
valores posibles.
Para agregar un campo a una clase, el código podría ser como el que sigue.
Public Casado As Boolean
La mayoría de las propiedades, sin embargo, son más complejas; en la mayor parte de
los casos utilizaremos procedimientos de propiedad para agregar una propiedad a una
clase.
Los procedimientos de propiedad tienen tres partes:
Una declaración de una variable privada para almacenar el valor de la
propiedad.
Un procedimiento Get que expone el valor.
Un procedimiento Set que, como indica su nombre, establece el valor en la
clase.
Por ejemplo, un procedimiento de propiedad para una propiedad Name, de la clase
Personas, podría ser como el que sigue:
Private ValorNombre As String
Public Property Nombre() As String
Get
Nombre = ValorNombre
End Get
Set(ByVal valor As String)
ValorNombre = valor
End Set
End Property
Recibe el dato en la variable ValorNombre de
La clase
Devuelve el contenido de la variable ValorNombre
125
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
La primera línea de código declara una variable String privada, ValorNombre que
almacenará el valor de la propiedad. El procedimiento de propiedad en sí comienza
con Public Property y termina con End Property.
El procedimiento Get contiene el código que se ejecutará cuando desee leer su valor;
por ejemplo, si lee la propiedad Personas.Nombre, el código devolverá el valor
almacenado en la variable ValorNombre
El procedimiento Set contiene código que se utiliza para asignar un nuevo valor a la
variable ValorNombre usando un valor pasado como argumento Valor. Por ejemplo, si
escribimos el código
Personas.Nombre = "Wyrm"
El valor String Wyrm se pasará como argumento Valor; el código del procedimiento Set
lo asignará a la variable ValorNombre para su almacenamiento.
¿Por qué complicarnos tanto, en lugar de utilizar un campo que represente la
propiedad Nombre? En el mundo real, hay ciertas reglas para los nombres: por
ejemplo, los nombres normalmente no contienen números. Puede agregar código al
procedimiento Set para comprobar el argumento Valor y devolver un error si contiene
números.
Siguiendo con la Clase Personas, ahora agregaremos un campo y tres propiedades:
1. Abrimos el proyecto Personas que hicimos en la sección anterior. Si no lo
guardaste, primero deberás regresar a la sección anterior, crear la primera
clase, y realizar hasta el final los procedimientos de esa sección.
2. En el Explorador de soluciones, seleccionamos Personas.vb y en el menú Ver
elegimos Código.
3. Agregamos el siguiente código de declaración debajo de la línea Public Class
Personas.
126
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Private ValorPrimerNombre As String
Private ValorSegundoNombre As String
Private ValorApellido As String
Public Casado As Boolean
4. Agregamos los siguientes procedimientos de propiedad debajo del código de
declaración anterior.
Public Property PrimerNombre() As String
Get
PrimerNombre = ValorPrimerNombre
End Get
Set(ByVal valor As String)
ValorPrimerNombre = Valor
End Set
End Property
Public Property SegundoNombre() As String
Get
SegundoNombre = ValorSegundoNombre
End Get
Set(ByVal valor As String)
ValorSegundoNombre = Valor
End Set
End Property
Public Property Apellido() As String
Get
Apellido = ValorApellido
End Get
Set(ByVal valor As String)
ValorApellido = Valor
End Set
End Property
Quedará así:
5. En el menú Archivo, elegimos Guardar todo para guardar el trabajo.
Propiedades de sólo lectura y escritura
A veces una propiedad se establece una vez y no cambia nunca mas durante la
ejecución del programa. Por ejemplo, una propiedad que representa un número de
empleado nunca debe cambiar, de modo que otro programa si lo pueda leer, pero no
se permitirá que ese programa cambie su valor.
La palabra clave ReadOnly se utiliza para especificar que un valor de propiedad se
pueda leer pero no modificar.
127
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Nota: Si intentamos asignar un valor a una propiedad ReadOnly, aparecerá un error en
el Editor de código.
Para crear una propiedad de sólo lectura, deberemos crear un procedimiento de
propiedad con un procedimiento Get, pero sin procedimiento Set, como se muestra a
continuación.
Private IDValue As Integer
ReadOnly Property ID() As Integer
Get
ID = IDValue
End Get
End Property
De igual forma, la palabra clave WriteOnly permite establecer un valor de propiedad
pero no permite que se lea; por ejemplo, no permite que otros programas lean una
propiedad de contraseña. Podemos utilizar ese valor para realizar acciones dentro de
la clase, pero deseará que sigan siendo privadas.
Para crear una propiedad de sólo escritura, se creará una propiedad con un
procedimiento Set pero sin procedimiento Get, como a continuación:
Private passwordValue As String
WriteOnly Property Password() As String
Set(ByVal value As String)
passwordValue = value
End Set
End Property
Los procedimientos de propiedad ReadOnly y WriteOnly también son útiles cuando
deseamos tomar un valor de propiedad y convertirlo en un valor diferente. Por
ejemplo, pensemos en la edad de una persona. A diferencia del nombre, la edad
cambia con el tiempo, si ha asignado la edad a una clase y la lee de nuevo un año
después, sería incorrecta.
En la clase Persons, podemos evitarlo agregando dos propiedades: una propiedad
"WriteOnly BirthYear" que representa el año de nacimiento, que nunca cambia, y una
propiedad "ReadOnly Age" que devuelve un valor calculando la diferencia entre el año
en curso y el año de nacimiento.
Siguiendo con la Clase Persons, ahora agregaremos propiedades ReadOnly y
WriteOnly a la clase:
1. Agregamos el siguiente código de declaración debajo de las otras declaraciones
en la parte superior del módulo de clase.
Private birthYearValue As Integer
128
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
2. Introducimos los siguientes procedimientos de propiedad debajo del código de
declaración.
WriteOnly Property BirthYear() As Integer
Set(ByVal value As Integer)
birthYearValue = value
End Set
End Property
ReadOnly Property Age() As String
Get
Age = My.Computer.Clock.LocalTime.Year – birthYearValue
End Get
End Property
3. En el menú Archivo, elegimos Guardar todo para guardar el trabajo.
6.4.- Agregar métodos a una clase
Agregaremos métodos a una clase, para que puedan realizar acciones. Vimos que la
mayoría de los objetos tienen acciones que pueden realizar; estas acciones se conocen
como métodos.
La clase Persons que creamos en la sección anterior,tiene muchas acciones que
pueden realizar las personas y, estas acciones se pueden expresar como métodos de
clase.
Métodos de una clase
Los métodos de una clase son simplemente procedimientos Sub o Function, declarados
en la clase.
Por ejemplo, una clase Cuenta puede tener un procedimiento Sub denominado
Recalcular, que actualizará el balance o un procedimiento Function denominado
CurrentBalance para devolver el último balance.
El código para declarar esos métodos puede ser similar al siguiente:
Public Sub Recalcular()
'Aqui el codigo para recalcular Cuenta.
End Sub
Ejemplo:
Public Function BalanceCuenta(ByVal AccountNumber As Integer) As Double
'Codigo para volver a Balance
End Function
129
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Si bien la mayoría de los métodos de clase son públicos, también se pueden agregar
métodos que sólo la clase en sí puede utilizar. Por ejemplo, la clase Personas puede
tener su propia función para calcular la edad de una persona. Si declara la función
como Private, no se puede ver o llamar desde fuera de la clase.
El código para una función privada puede ser similar a éste otro:
Private Function CalcuEdad(ByVal year As Integer) As Integer
CalcuAge = My.Computer.Clock.LocalTime.Year - year
End Function
Más tarde podremos cambiar el código que calcula el valor CalcAge y el método
seguirá funcionando bien sin cambiar ningún código que utilice el método. Ocultar el
código que realiza el método, se conoce como la "encapsulación", ya explicada al
comienzo.
Ahora, para agregar un método a la clase Persons, hacemos lo siguiente:
Abrimos el proyecto Personas (si no lo tenemos abierto ya de antes) que
hicimos en las secciones anteriores. Si no lo guardaste, o no lo creaste, primero
deberás volver a las secciones anteriores, agregar propiedades a la clase, y
completar los procedimientos.
En el Explorador de soluciones, seleccionamos Personas.vb y, en el menú Ver,
hacemos clic en Código. Agregamos el siguiente código bajo los procedimientos
de propiedad.
Public Function NombreComplet() As String
If ValorSegundoNombre <> "" Then
NombreCompleto = ValorPrimerNombre & " " &
ValorSegundoNombre & " " & ValorApellido
Else
NombreCompleto = ValorPrimerNombre & " " &
ValorApellido
End If
End Function
Private Function CalcuEdad(ByVal year As Integer) As Integer
CalcuEdad = My.Computer.Clock.LocalTime.Year - year
End Function
Modificamos el código en el procedimiento de la propiedad Age para utilizar la
función privada:
ReadOnly Property Age() As String
Get
'Age = My.Computer.Clock.LocalTime.Year –
birthDateValue
130
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Age = CalcuEdad(birthYearValue)
End Get
End Property
Antes, el código era así:
ReadOnly Property Age() As String
Get
Age = My.Computer.Clock.LocalTime.Year –
birthYearValue
End Get
End Property
En el menú Archivo, hacemos clic en Guardar todo para guardar el trabajo.
6.5.- Agregar eventos a una clase
Un programa puede responder a eventos externos, como por ejemplo, un usuario que
hace clic en un botón. En esta sección, obtendremos información sobre cómo agregar
eventos a una clase.
Primero, debemos declarar el evento.
A continuación, debemos provocarlo.
Provocar un evento significa que estamos señalizando la aparición del evento. Para
agregar un evento a una clase, lo declaramos con la instrucción Event. Ésto indica que
el objeto puede provocar el evento que especificamos.
Por ejemplo, quizás deseemos agregar un evento AgeCalculated a la clase Persons que
hicimos. Podemos provocar a continuación el evento en el método CalcAge. Después
de hacer esto, cuando se llama al método, podemos ejecutar algún código adicional en
cuanto se haya calculado la edad de la persona.
Para agregar un evento a la clase Persons
Abrimos el proyecto Persons.
En el Explorador de soluciones, seleccione Persons.vb y, en el menú Ver,
hacemos clic en Código.
Agregamos el siguiente código encima de los procedimientos de propiedad.
131
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Public Event AgeCalculated(ByVal Age As Single)
En el método CalcAge, reemplazamos el código existente por el siguiente
código para provocar el evento.
Private Function CalcAge(ByVal year As Integer) As Integer
Dim Age = My.Computer.Clock.LocalTime.Year - year
RaiseEvent AgeCalculated(Age)
CalcAge = My.Computer.Clock.LocalTime.Year - year
End Function
En el menú Archivo, hacemos clic en Guardar todo para guardar el trabajo.
Probar una clase
Creamos una clase llamada "Persons" y le proporcionamos propiedades, métodos y
eventos. Lo que hemos hecho hasta ahora es agregar código, ahora es el momento de
utilizar la clase Persons y asegurarse de que funciona según lo esperado.
6.6.- Crear una instancia de una clase
Los formularios y controles son en realidad clases; cuando arrastramos un control
Button a un formulario, estamos creando realmente una instancia de la clase Button.
También podemos crear instancias de cualquier clase en el código utilizando una
declaración con la palabra clave New. Por ejemplo, para crear una nueva instancia de
la clase Button, agregaremos el código siguiente.
Dim aButton As New Button
Para utilizar y probar la clase Persons, debemos crear primero un proyecto de prueba y
agregar una referencia al módulo de clase.
Para crear un proyecto de prueba para la clase Persons
Abrimos el proyecto Persons que creamos en las secciones anteriores.
En el menú Archivo, elegimos Agregar y, a continuación, hacemos clic en Nuevo
proyecto.
132
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
En el panel Plantillas, en el cuadro de diálogo Nuevo proyecto, hacemos clic en
Aplicación de Windows Forms.
En el cuadro Nombre, escribimos PersonsTest y hacemos clic en Aceptar.
Se agregará un nuevo proyecto de Windows Forms al Explorador de soluciones
y aparecerá un nuevo formulario.
133
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
En el Explorador de soluciones, seleccionamos el proyecto PersonsTest y, en el
menú Proyecto, hacemos clic en Establecer como proyecto de inicio.
En el Explorador de soluciones, seleccionamos el proyecto PersonsTest y, en el
menú Proyecto, hacemos clic en Agregar referencia.
Aparecerá el cuadro de diálogo Agregar referencia.
Hacemos clic en la ficha Proyectos, seleccionamos Personas y hacemos clic en
Aceptar.
134
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Hacemos doble clic en el formulario para abrir el editor de código y escribimos
la siguiente declaración justo debajo de la línea Public Class Form1.
Dim person1 As New Persons.Persons
Esto declara una nueva instancia de la clase Persons.
Quizás os preguntéis por qué tuvimos que escribir dos veces Persons, pues
porque la primera instancia es el módulo de clase Persons.vb y la segunda
instancia es la clase Persons de ese módulo.
En el menú Archivo, hacemos clic en Guardar todo.
El siguiente paso es agregar una interfaz de usuario y un código que utilice la clase
Persons.
Agregaremos cuadros de texto donde el usuario especificará los valores para cada una
de las propiedades (excepto la propiedad de sólo lectura "Age"), una casilla para el
campo "Married" y botones para probar cada uno de los métodos públicos.
Para probar la clase Persons:
En el Explorador de soluciones, seleccionamos Form1 y, en el menú Ver,
hacemos clic en Diseñador.
En el Cuadro de herramientas, arrastramos cuatro controles TextBox, un
control CheckBox y dos controles Button al formulario.
135
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Seleccionamos el primer control Button y, a continuación, en la ventana
Propiedades establecemos la propiedad Text en Update.
Seleccionamos el segundo control Button y en la ventana Propiedades
establecemos la propiedad Text en Full Name.
Hacemos doble clic en el primer botón (Update) para abrir el Editor de código y
en el controlador de eventos Button1_Click, agregamos el siguiente código:
With person1
.FirstName = Textbox1.Text
.MiddleName = Textbox2.Text
.LastName = Textbox3.Text
.BirthYear = Textbox4.Text
.Married = CheckBox1.Checked
End With
En el controlador de eventos Button2_Click, agregamos lo siguiente:
MsgBox(person1.NombreCompleto)
MsgBox(CStr(person1.Edad) & " años")
If person1.Casado = True Then
MsgBox(person1.PrimerNombre & " es casado")
Else
MsgBox(person1.Primernombre & " es soltero")
End If
Presionamos F5 para ejecutar el proyecto y mostrar el formulario:
-En el primer cuadro de texto, escribimos nuestro nombre.
-En el segundo cuadro de texto, escribimos nuestro segundo nombre.
-En el tercer cuadro de texto, escribimos nuestro apellido.
-En el cuarto cuadro de texto, escribimos el año de nuestro nacimiento con
cuatro dígitos (por ejemplo, 1983).
-Activamos la casilla de si estamos casados/as.
136
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Hacemos clic en el botón "Update" para establecer las propiedades de la clase y
clic en el botón "Full Name".
Se muestran tres cuadros de mensaje. Estos cuadros de mensaje muestran su
nombre completo, edad y estado civil.
En el menú Archivo, hacemos clic en Guardar todo.
6.7.-Cómo utilizar los constructores
Introducción
En Visual Basic .NET, la inicialización de nuevos objetos se controla utilizando
constructores. Para crear un constructor para una clase, se crea un procedimiento
denominado Sub New en cualquier lugar de la definición de la clase.
Características de Sub New
El constructor Sub New tiene las siguientes características:
El código del bloque Sub New siempre se ejecutará antes de cualquier otro código de
una clase.
137
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
El constructor Sub New solo se ejecutará una vez, cuando se cree un objeto.
Ejemplo de Sub New
El siguiente ejemplo muestra cómo utilizar el constructor Sub New:
Public Sub New( )
' Perform simple inicialización
intValue = 1
End Sub
La siguiente línea de código crea un objeto desde una clase denominada BankAccount,
ya definida en la aplicación.
Dim myAccount As New BankAccount( )
Podemos sobrecargar New y crear tantos constructores de clases como sean necesarios.
Esto resulta útil si deseamos inicializar nuestro objeto cuando lo creemos.
Sobrecarga de constructores
Podemos sobrecargar constructores del mismo modo que se sobrecarga cualquier otro
método de una clase. No obstante, no podemos utilizar la palabra clave Overloads
cuando sobrecargamos constructores. El siguiente ejemplo muestra cómo sobrecargar
New y crear múltiples constructores de clase:
Class BankAccount
Private balance as Double
Sub New( )
' Initialize balance
balance = 0.0
End Sub
Sub New(ByVal amount As Double)
balance = amount
End Sub
End Class
Uno de los constructores del ejemplo anterior toma un parámetro. Si estamos creando
un objeto desde tal clase, podemos incluir sus parámetros en la declaración. El siguiente
ejemplo muestra cómo invocar el método New que toma un parámetro.
Dim myAccount As New BankAccount(120.00)
Para escribir nuestros propios constructores de clase, crearemos un método con el
nombre New( ), como vemos en el Código. En dicho ejemplo, al instanciarse un
objeto de la clase Empleado, se asignará a una de sus propiedades la fecha actual.
Interfase grafica cliente
Public class form1…..
Private Sub Botton_Click …
Dim loEmp As Empleado
loEmp = New Empleado()
138
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
MsgBox("El objeto se ha creado el día "& loEmp.FechaCrea)
End Sub
End class
Public Class Empleado
Private mdtFechaCrea As Date
Public Property FechaCrea() As Date
Get
Return mdtFechaCrea
End Get
Set(ByVal Value As Date)
mdtFechaCrea = Value
End Set
End Property
' método constructor
Public Sub New()
' asignamos un valor inicial a una variable de propiedad
Me.FechaCrea = Now
End Sub
End Class
Al igual que ocurre en un método normal, New( ) admite parámetros; esto nos
sirve para asignar valores de inicio al objeto en el momento de su instanciación.
La denominación para este tipo de métodos es constructor parametrizado. El
Código nos muestra una variación del fuente anterior, utilizando un constructor de
este tipo.
Interfase grafica cliente
Public class form1…..
Private Sub Botton_Click …
Dim loEmp As Empleado
loEmp = New Empleado("5/7/2002")
MsgBox("El objeto se ha creado el día "& loEmp.FechaCrea)
' este es otro modo de instanciar
' un objeto con un constructor parametrizado
Dim loEmp2 As New Empleado("08/4/2002")
End Sub
End Class
Public Class Empleado
Private mdtFechaCrea
Public Property FechaCrea() As Date
Get
Return mdtFechaCrea
End Get
Set(ByVal Value As Date)
139
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
mdtFechaCrea = Value
End Set
End Property
' método constructor con parámetro
Public Sub New(ByVal ldtFecha As Date)
' asignamos el valor del parámetro a una variable de propiedad
Me.FechaCrea = ldtFecha
End Sub
End Class
Combinando las características de métodos constructores junto a las de sobrecarga,
podemos crear un conjunto de constructores sobrecargados para la clase.
Public Class Empleado
Public psNombre
Public psApellidos
Public psCiudad
Private mdtFechaCre
' en este constructor sin parámetros, asignamos la fecha actual
Public Sub New()
mdtFechaCrea = Now()
End Sub
' en este constructor, asignamos valores a todos los campos de la clase
Public Sub New(ByVal lsNombre As String, ByVal lsApellidos As String, ByVal
lsCiudad As String)
psNombre = lsNombre
psApellidos = lsApellidos
psCiudad = lsCiudad
End Sub
End Class
6.8.-Cómo utilizar los destructores
Introducción
En Visual Basic .NET, podemos controlar qué ocurre durante la destrucción de objetos
utilizando procedimientos denominados destructores.
Finalize y Dispose
El sistema invoca al destructor Finalize antes de liberar el objeto. Puede utilizarse para
limpiar recursos abiertos, como conexiones a bases de datos, o para liberar otros
140
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
recursos. Sin embargo, existe una demora entre el momento en que un objeto pierde su
alcance y el momento en que se invoca al destructor Finalize.
La ejecución de Sub Finalize provoca una ligera pérdida en el rendimiento, por ello
únicamente debería definirse un método Sub Finalize cuando sea necesario liberar
objetos explícitamente.
Visual Basic .NET permite un segundo tipo de destructor, denominado Dispose, que
puede ser invocado explícitamente en cualquier momento para liberar recursos de forma
inmediata. Dispose no se incluye en el ámbito de este curso. Si desea más información
sobre Dispose, puede consultar “Duración de los objetos: cómo se crean y destruyen”
en la documentación de Visual Studio .NET.
Nota
Ejemplo de Sub Finalize
El siguiente ejemplo muestra cómo utilizar el destructor Finalize:
Protected Overrides Sub Finalize( )
' Can close connections or other resources
conn.Close
End Sub
Protected es un modificador de acceso que establece el nivel de accesibilidad.
6.9.-Cómo utilizar miembros de datos compartidos
Introducción
En Visual Basic .NET, los miembros de datos compartidos pueden utilizarse para
permitir que múltiples instancias de una clase hagan referencia a una única variable a
nivel de clase.
Sintaxis
Utilizaremos la siguiente sintaxis para declarar miembros de datos compartidos:
NiveldeAcceso Shared MiembrodeDatos As TipodeDatos
Niveles de acceso
Los miembros de datos compartidos están directamente enlazados a la clase, y podemos
declararlos como públicos o privados. Si declaramos los miembros de datos como
públicos, estarán accesibles para cualquier código que pueda acceder a la clase. Si
declaramos los miembros de datos como privados, proporcionaremos propiedades
compartidas públicas para acceder a la propiedad compartida privada.
Ejemplo
El siguiente ejemplo muestra cómo crear una clase de cuenta de ahorro
(SavingsAccount) que utilice un miembro de datos compartido público para mantener
los tipos de interés para una cuenta de ahorro:
141
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Class SavingsAccount
Public Shared InterestRate As Double
Public Function CalculateInterest( ) As Double
...
End Function
End Class
El valor del miembro de datos InterestRate de la clase SavingsAccount puede
establecerse globalmente con independencia del número de instancias de la clase que
estén en uso. El valor se utiliza para calcular el interés del saldo actual.
Invocar miembros de datos compartidos desde un cliente
Después de crear una clase que utilice miembros de datos compartidos públicos,
podemos invocar los miembros de datos de esa clase desde una aplicación cliente. El
siguiente código muestra cómo invocar la clase SavingsAccount y sus miembros de
datos desde una aplicación cliente:
Sub Test( )
SavingsAccount.InterestRate = 0.03
Dim myAccount As New SavingsAccount( )
Dim yourAccount As New SavingsAccount( )
MessageBox.Show(myAccount.CalculateInterest( ))
MessageBox.Show(yourAccount.CalculateInterest( ))
End Sub
En el examen de este código, se observa lo siguiente:
InterestRate puede establecerse antes y después de la creación de cualquier instancia de
la clase SavingsAccount.
Cualquier modificación a InterestRate se aplicará a todas las instancias de la clase
SavingsAccount.
Propiedades compartidas
También pueden crearse propiedades compartidas en las clases. El siguiente ejemplo
muestra cómo declarar una propiedad compartida denominada Rate en la clase
SavingsAccount:
Class SavingsAccount
Private Shared interestRate As Double
Shared Property Rate( ) As Double
Get
Return interestRate
End Get
Set(ByVal Value As Double)
interestRate = Value
End Set
End Property
End Class
142
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Invocar propiedades compartidas desde un cliente
Una vez declarada la propiedad compartida Rate, puede utilizarse en una aplicación
cliente en lugar de acceder directamente al miembro de datos compartido interestRate.
Podemos invocar una propiedad compartida cualificándola con el nombre de clase o con
el nombre de variable de una instancia específica de la clase.
El siguiente código muestra cómo invocar una propiedad compartida cualificándola con
el nombre de la clase:
SavingsAccount.Rate = 0.03
El siguiente código muestra cómo invocar una propiedad compartida utilizando el
nombre de variable de una instancia específica de la clase:
6.10.-Cómo utilizar los métodos compartidos
Introducción
Podemos utilizar los miembros de procedimiento compartidos para diseñar funciones
que pueden ser invocadas sin crear una instancia de la clase. Los procedimientos
compartidos son métodos de una clase que no están asociados a una instancia específica
de una clase. Los miembros de procedimiento compartidos únicamente pueden acceder
a datos marcados con la palabra clave Shared. Por ejemplo, un método compartido no
puede hacer referencia a un miembro de la instancia de una clase.
Ejemplo del uso de un miembro de procedimiento compartido
El siguiente ejemplo muestra cómo una función utilizada habitualmente, como
GetComputerName, puede crearse como un miembro de procedimiento compartido de
forma que una aplicación cliente puede utilizarla fácilmente. El cliente únicamente
necesita hacer referencia al método prefijado por el nombre de la clase, ya que no se
requiere ninguna instancia de la clase.
' TestClass code
Public Shared Function GetComputerName( ) As String
...
End Function
' Client code
MessageBox.Show(TestClass.GetComputerName( ))
Observaremos también que, en el código anterior, Show es un método compartido de la
clase MessageBox.
143
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
6.11.-¿Qué es el polimorfismo?
Introducción
La mayoría de sistemas de programación orientada a objetos proporcionan
polimorfismo mediante herencia. El polimorfismo basado en herencia implica la
definición de métodos en una clase base y sobrecargarlos con nuevas implementaciones
en clases derivadas.
Definición
Polimorfismo hace referencia a la capacidad de definir múltiples clases con diferentes
funcionalidades pero con métodos o propiedades de nombres idénticos que pueden
utilizarse de forma intercambiable por el código cliente en tiempo de ejecución. El
nombre del método reside en la clase base. Las implementaciones de métodos residen
en las clases derivadas. Para gestionar esto, únicamente puede declararse en la clase
base el nombre del método (no el código que proporciona la funcionalidad del método).
Ejemplo de polimorfismo
Supongamos que definimos una clase denominada BaseTax que proporciona
funcionalidad básica para calcular el impuesto sobre las ventas de un estado. Las clases
derivadas de BaseTax, como CountyTax o CityTax, podrían implementar métodos
como CalculateTax.
Polimorfismo hace referencia al hecho de que la implementación del método
CalculateTax podría ser distinta en cada una de las clases derivadas. Por ejemplo, el
tipo impositivo de un condado (county tax rate) podría ser distinto del tipo impositivo
de una ciudad (city tax rate). Las clases que hereden de BaseTax tendrán un método
CalculateTax, pero el modo como se calcule realmente el impuesto podría variar en
cada una de las clases derivadas.
Sobrecarga de métodos o polimorfismo, en una misma clase
La sobrecarga de métodos, es una técnica que consiste en crear varios métodos con
idéntico nombre dentro de la misma clase, distinguiéndose entre sí por su lista de
parámetros. Analicemos el siguiente ejemplo:
Interfase grafica cliente
Public class form1…..
Private Sub Botton_Click …
Dim loEmpleado As New Empleado()
Dim ldbResultadoIncent As Double
loEmpleado.Salario = 1020.82
'llamada al primer método sobrecargado
loEmpleado.Sueldo()
144
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
'llamada al segundo método sobrecargado
MsgBox("El sueldo se transferirá el día " & loEmpleado.Sueldo(29))
'llamada al tercer método sobrecargado
ldbResultadoIncent = loEmpleado.Sueldo(50.75, "Extras")
MsgBox(“El incentivo a pagar será " & ldbResultadoIncent)
End Sub
End Class
Public Class Empleado
Private mdbSalario As Double
Public Property Salario() As Double
Get
Return mdbSalario
End Get
Set(ByVal Value As Double)
mdbSalario = Value
End Set
End Property
' Métodos sobrecargados
Public Overloads Sub Sueldo()
' aquí mostramos en consola el importe del sueldo formateado
MsgBox("El sueldo es " & Format(Me.Salario, "#,#.##"))
End Sub
Public Overloads Function Sueldo(ByVal liDia As Integer) As String
' Aquí mostramos la fecha del mes actual en la que se
' realizará la transferencia del sueldo al banco del empleado
Dim ldtFechaActual As Date
Dim lsFechaCobro As String
ldtFechaActual = Now()
lsFechaCobro = CStr(liDia) & "/" & _
CStr(Month(ldtFechaActual)) & "/" & _
CStr(Year(ldtFechaActual))
Return lsFechaCobro
End Function
Public Overloads Function Sueldo(ByVal ldbImporteIncentivo As Double,ByVal
lsTipoIncentivo As String) As Double
' aquí calculamos la cantidad de incentivo que se añadirá al
' sueldo del empleado,en función del tipo de incentivo
Dim ldbIncentivo As Double
145
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
' según el tipo de incentivo, se descuenta un importe de la cantidad del
‘ incentivo
Select Case lsTipoIncentivo
Case "Viajes"
ldbIncentivo = ldbImporteIncentivo - 30
Case "Extras"
ldbIncentivo = ldbImporteIncentivo - 15
End Select
Return ldbIncentivo
End Function
End Class
Métodos sobrecargados
Para crear un método sobrecargado, agregamos dos o más procedimientos Sub o
Function a la clase, cada uno con el mismo nombre.
En las declaraciones de procedimiento, el conjunto de argumentos para cada
procedimiento debe ser distinto o se producirá un error.
El siguiente ejemplo muestra un método con dos sobrecargas, una que acepta una
String y la otra que acepta un Integer como argumentos.
Public Sub TestFunction(ByVal input As String)
MsgBox(input)
End Sub
Public Sub TestFunction(ByVal input As Integer)
MsgBox(CStr(input))
End Sub
Si se debe llamar a este método desde el código y pesarle una cadena, se ejecutaría la
primera sobrecarga y un cuadro de mensaje mostraría la cadena; si se le pasó un
número, se ejecutaría la segunda sobrecarga y el número se convertiría en una cadena
y aparecería en el cuadro de mensaje.
Podemos crear tantas sobrecargas como sean necesarias y cada una de ellas puede
contener un número diferente de argumentos.
En la clase Persons, agregaremos un método con dos sobrecargas para devolver la
inicial del segundo nombre de una persona; una sólo con la inicial y la otra con la inicial
seguida por un punto.
Probar los métodos sobrecargados en la clase Persons
Abrimos el proyecto Persons que creamos en la secciones anteriores.
En el Explorador de soluciones, seleccionamos Persons.vb y, en el menú Ver,
elegimos Código.
146
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Agregamos el siguiente código debajo de los métodos existentes.
Public Function MiddleInitial() As String
MiddleInitial = Left$(middleNameValue, 1)
End Function
Public Function MiddleInitial(ByVal period As Boolean) As String
MiddleInitial = Left$(middleNameValue, 1) & "."
End Function
En el Explorador de soluciones, seleccionamos Form1 y, en el menú Ver,
hacemos clic en Diseñador.
En el Cuadro de herramientas, arrastramos dos controles más de Button al
formulario.
Seleccionamos el tercer control Button y en la ventana Propiedades
establecemos su propiedad Text en With.
Seleccionamos el cuarto control Button y en la ventana Propiedades
establecemos su propiedad Text en Without.
Hacemos doble clic en el primer botón (With) para abrir el Editor de código y
escribimos el siguiente código en el controlador de eventos Button3_Click.
En el controlador de eventos Button4_Click, agregamos el siguiente código.
MsgBox(person1.FirstName & " " & person1.MiddleInitial & _
" " & person1.LastName)
Presionamos F5 para ejecutar el proyecto y mostrar el formulario.
-En el primer cuadro de texto, escribimos nuestro nombre.
-En el segundo cuadro de texto, escribimos nuestro segundo apellido.
-En el tercer cuadro de texto, escribimos nuestro tercer apellido.
-En el cuarto cuadro de texto, escribimos el año de nuestro nacimiento con
cuatro dígitos (por ejemplo, 1983).
-Activamos la casilla si está casado/a.
147
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Hacemos clic en el botón Actualizar para establecer las propiedades de la clase
y hacemos clic en el botón With.
Se abrirá un cuadro de mensaje. Muestra nuestro nombre con un punto tras la
inicial del primer apellido.
Hacemos clic en el botón Without.
Se abrirá un cuadro de mensaje. Muestra nuestro nombre sin el punto tras la
inicial del primer apellido.
148
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
En el menú Archivo, hacemos clic en Guardar todo.
6.12.-Probar controladores de eventos
Si deseamos escribir código que responda a un evento (o que controle un evento),
debemos asociar ese evento a un controlador de eventos. Podemos hacerlo mediante
la instrucción Handles o Add Handler.
La instrucción Add Handler permite asociar los eventos a los controladores en tiempo
de ejecución, mientras que la instrucción Handles sólo asocia los eventos a los
controladores en tiempo de compilación. La instrucción Handles se puede agregar al
final de cualquier subrutina que tenga la misma firma que el evento.
Por ejemplo, antes, agregamos un evento denominado "AgeCalculated" que toma un
parámetro de tipo "Integer". La subrutina que crea para controlar el evento también
debe tomar un parámetro Integer, como se observa en el código siguiente.
Private Sub person1_AgeCalculated(ByVal Age As Integer) _
Handles person1.AgeCalculated
El objeto person1 se debe crear con la instrucción WithEvents para que se pueda tener
acceso al evento AgeCalculated. Al usar la instrucción Add Handler, puede asociar
dinámicamente los eventos a controladores en tiempo de ejecución.
Probamos el controlador de eventos en la clase Person
En el Explorador de soluciones, seleccionamos Form1 y, en el menú Ver,
hacemos clic en Código.
Agregamos la instrucción WithEvents antes de la declaración person1, como se
muestra en el código siguiente:
WithEvents person1 As New Persons.Persons
149
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Agregamos el procedimiento siguiente a Form1. Este código comprueba la edad
calculada y muestra un mensaje basado en el resultado.
Private Sub person1_AgeCalculated(ByVal Age As Integer) _
Handles person1.AgeCalculated
If Age > 18 Then
MsgBox("You have been over 18 for " & Age - 18 _
& " years.")
Else
MsgBox("You will be 18 in " & 18 - Age & " years")
End If
End Sub
Presionamos F5 para ejecutar el proyecto y mostrar el formulario.
-En el primer cuadro de texto, escribimos nuestro nombre.
-En el segundo cuadro de texto, escribimos nuestro segundo apellido.
-En el tercer cuadro de texto, escribimos nuestro tercer apellido.
-En el cuarto cuadro de texto, escribimos el año de nuestro nacimiento con
cuatro dígitos (por ejemplo, 1983).
-Activamos la casilla si está casado/a.
Hacemos clic en el botón Actualizar para establecer las propiedades de la clase
y haga clic en el botón Full Name.
Un cuadro de mensaje muestra su nombre completo. Si tiene más de 18 años,
otro cuadro de mensaje muestra información sobre cuánto tiempo hace que
cumplió los 18 años. Si tiene menos de 18 años, aparece un cuadro de mensaje
que muestra información sobre cuánto tiempo queda hasta que cumpla los 18
años. A continuación, otro cuadro de mensaje muestra su edad.
150
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
En el menú Archivo, hacemos clic en Guardar todo.
6.13.- Herencia en Visual Basic NET
La Herencia especifica una relación “es un tipo de”
Múltiples clases comparten los mismos atributos y operaciones, permitiendo una eficaz
reutilización del código
Introducción
En la programación orientada a objetos, podemos compartir las características de una
clase base en otras clases derivadas de la clase base. Esto se denomina herencia.
Definición
Herencia es el concepto de reutilizar atributos y operaciones comunes de una clase base
en una clase derivada.
Cómo heredar de una clase
Una clase derivada hereda de una clase base
Pueden heredarse propiedades, métodos, miembros de datos, eventos y controladores de
eventos (dependiendo del ámbito)
Palabras clave
Inherits: hereda de una clase base
NotInheritable: no es heredable
MustInherit: no pueden crearse instancias de la clase; deben heredarse como una clase
base
Introducción
Persona
Cliente Empleado
Clase base
Clase Derivada
151
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
En Visual Basic .NET, la herencia puede utilizarse para derivar una clase de una clase
existente. La clase derivada puede heredar todas las propiedades, métodos, miembros de
datos, eventos y controladores de eventos de la clase base, facilitando la reutilización de
la clase base por toda la aplicación.
La palabra clave Inherits
La palabra clave Inherits se utiliza para definir una clase derivada que heredará de una
clase base existente.
Ejemplo: El siguiente ejemplo muestra cómo utilizar la palabra clave Inherits:
Public Class CheckingAccount
Inherits BankAccount
Private Sub ProcessCheck( )
' Add code to process a check drawn on this account
End Sub
End Class
Observacion Podemos utilizar la palabra clave MyBase para invocar métodos en una
clase base cuando invalidan métodos en una clase derivada. También podemos utilizar
la palabra clave MyBase para invocar el constructor y el destructor de la clase base en
nuestra clase derivada.
Observemos el siguiente ejemplo:
'Crear clase derivada en dos líneas
Public Class Administrativo
Inherits Empleado
' Crear clase derivada en la misma línea
Public Class Administrativo : Inherits Empleado
La palabra clave NotInheritable
La palabra clave NotInheritable se utiliza para definir una clase que no puede utilizarse
como clase base para herencia. Si otra clase intenta heredar de esta clase, se generará un
error de compilación.
Ejemplo: El siguiente ejemplo muestra cómo utilizar la palabra clave NotInheritable:
Public NotInheritable Class TestClass
...
End Class
Public Class DerivedClass
' The following line generates a compiler error
Inherits TestClass
152
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
...
End Class
La palabra clave MustInherit
La palabra clave MustInherit se utiliza para definir clases que no están pensados para
ser utilizados directamente como objetos instanciados. La clase resultante debe ser
heredada como una clase base para utilizarla en el objeto de una clase derivada
instanciada.
Ejemplo: El siguiente ejemplo muestra cómo utilizar la palabra clave MustInherit:
Public MustInherit Class BaseClass
...
End Class
...
Si el código cliente intenta crear una instancia de este tipo de clase, se generará un error
de compilación, como se muestra en el siguiente ejemplo:
' Client code
' The following line generates a compiler error
Dim x As New BaseClass( )
La palabra clave Protected
Utilizamos el acceso Protected para limitar el ámbito de una propiedad, método,
miembro de datos, evento o controlador de eventos a la clase que los define y cualquier
clase derivada basada en esa clase base.
Ejemplo
El siguiente ejemplo muestra cómo utilizar la palabra clave Protected:
Public Class BaseClass
' Accessible anywhere
Public counter As Integer
' Accessible only in this class or a derived class
Protected name As String
...
End Class
Generar una clase a partir de una clase existente: Herencia de clases
Ahora veremos cómo utilizar la herencia de clases para crear una clase basada en una
clase existente.
Muchos objetos de la vida real tienen atributos y comportamientos en común, por
ejemplo, todos los coches tienen ruedas y motores, y pueden avanzar y detenerse. Sin
embargo, algunos automóviles tienen atributos que no son comunes, por ejemplo, un
153
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
descapotable tiene una parte superior que se puede subir/bajar electrónica o
manualmente.
Si se creó un objeto para representar un automóvil, se pueden incluir propiedades y
métodos para todos los atributos y comportamientos comunes, pero no se podrían
agregar atributos como la cubierta de un descapotable, puesto que dicho atributo no
es generalizable a todos los automóviles.
Mediante el uso de la herencia, se puede crear una clase "descapotable" que deriva de
la clase "automóvil". Ésta hereda todos los atributos de la clase automóvil y puede
agregar los atributos y comportamientos que son únicos de un auto descapotable.
Heredar a partir de una clase existente
La instrucción Inherits se utiliza para declarar una nueva clase, denominada clase
derivada, basada en una clase existente conocida como clase base. Las clases derivadas
heredan todas las propiedades, los métodos, los eventos, los campos y las
constantes definidos en la clase base.
El siguiente código muestra la declaración de una clase derivada.
Class DerivedClass
Inherits BaseClass
…
End Class
Se pueden crear instancias de la nueva clase DerivedClass, se puede tener acceso a sus
propiedades y métodos como BaseClass y se pueden agregar nuevas propiedades y
métodos que son específicos de la nueva clase. Para ver un ejemplo, nos fijaremos en
la clase Persons que tenemos creada.
Supongamos que deseamos tener una clase que represente jugadores de béisbol: los
jugadores del béisbol tienen todos los atributos definidos en la clase Persons, pero
también tienen atributos únicos, como su número y posición. En lugar de agregar esas
propiedades a la clase Persons, se creará una nueva clase derivada que se hereda de
Persons, a la que se agregaran las nuevas propiedades.
Para crear una clase derivada de la clase Persons:
Abrimos el proyecto Persons que llevamos todo el tutorial usando.
En el Explorador de soluciones, seleccionamos el nodo del proyecto Persons.
En el menú Proyecto, elegimos Agregar clase.
154
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
En el cuadro de diálogo Agregar nuevo elemento, escribimos Players en el
cuadro Nombre, a continuación, hacemos clic en Agregar.
Se agregará un nuevo módulo de clase al proyecto.
En el Editor de código, agregamos lo siguiente justo debajo de la línea Public
Class Players.
Inherits Persons
Agregamos también el siguiente código para definir las dos nuevas
propiedades.
Private numberValue As Integer
Private positionValue As String
Public Property Number() As Integer
Get
Number = numberValue
End Get
Set(ByVal value As Integer)
155
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
numberValue = value
End Set
End Property
Public Property Position() As String
Get
Position = positionValue
End Get
Set(ByVal value As String)
positionValue = value
End Set
End Property
En el menú Archivo, hacemos clic en Guardar todo.
Probar la clase Players
Hemos creado una clase Players, derivada de la clase Persons.Ahora haremos una
nueva aplicación para probar la clase Players.
Para crear un proyecto de prueba para la clase:
1. En el menú Archivo, elegimos Agregar y, a continuación, hacemos clic en Nuevo
proyecto.
2. En el cuadro de diálogo Agregar nuevo proyecto, en el panel Plantillas,
seleccionamos una Aplicación de Windows Forms.
3. En el cuadro Nombre, escribimos PlayerTest y hacemos clic en Aceptar.
4. Se agregará un nuevo proyecto de Windows Forms al Explorador de soluciones
y aparecerá un nuevo formulario.
156
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
5. En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el
menú Proyecto, hacemos clic en Establecer como proyecto de inicio.
6. En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el
menú Proyecto, haga clic en Agregar referencia.
7. Se abrirá el cuadro de diálogo Agregar referencia.
8. Hacemos clic en la ficha Proyectos, elegimos Persons y hacemos clic en Aceptar.
9. Hacemos doble clic en el formulario para abrir el Editor de código y escribimos
la siguiente declaración justo debajo de la línea Public Class Form1.
Dim player1 As New Persons.Players
Dim player2 As New Persons.Players
Esto declara dos nuevas instancias de la clase Players.
10. En el menú Archivo, hacemos clic en Guardar todo.
Para probar la clase derivada:
1. En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest
y, a continuación, en el menú Ver, hacemos clic en Código.
157
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
2. En el Editor de código, agregamos el siguiente código al procedimiento de
evento Form1_Load.
With player1
.FirstName = "Wyrm"
.LastName = "Garcia"
.Number = 13
.Position = "Shortstop"
End With
With player2
.FirstName = "Joe"
.LastName = "Black"
.Number = 51
.Position = "Catcher"
End With
3. En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest
y, a continuación, en el menú Ver, hacemos clic en Diseñador.
158
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
4. En el Cuadro de herramientas, arrastramos dos controles Button al formulario.
5. Seleccionamos el primer control Button y en la ventana Propiedades
establecemos su propiedad Text en At Bat.
6. Seleccionamos el segundo control Button y en la ventana Propiedades
establecemos su propiedad Text en On Deck.
7. Hacemos doble clic en el primer botón (At Bat) para abrir el Editor de código y
escribimos el siguiente código en el controlador de eventos Button1_Click.
MsgBox(player1.Position & " " & player1.FullName & ", #" &
CStr(player1.Number) & " is now at bat.")
Observamos que estamos utilizando el método FullName que se heredó de la
clase base Persons.
8. En el controlador de eventos Button2_Click, agregamos el siguiente código.
MsgBox(player2.Position & " " & player2.FullName & ", #" &
CStr(player2.Number) & " is on deck.")
9. Presionamos F5 para ejecutar el programa. Hacemos clic en cada botón para
ver los resultados.
Clic al Boton1(At Bat):
159
MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua
Clic al Boton2 (on Deck):
10. En el menú Archivo, elegimos Guardar todo.
Hemos visto, qué son y cómo crear clases, agregarle propiedades, métodos y eventos,
las hemos heredado, etc. la mejor forma de aprender y de que las cosas se entiendan,
es haciéndolo uno mismo...

Más contenido relacionado

La actualidad más candente

Loreidys gonzales fundamentos de visual basic
Loreidys gonzales fundamentos de visual basicLoreidys gonzales fundamentos de visual basic
Loreidys gonzales fundamentos de visual basicloreidysgonzales
 
Guia bootstrap
Guia bootstrapGuia bootstrap
Guia bootstrapljds
 
Base de datos con Netbeans
Base de datos con NetbeansBase de datos con Netbeans
Base de datos con NetbeansRandy
 
56874982 curso-de-delphi-7
56874982 curso-de-delphi-756874982 curso-de-delphi-7
56874982 curso-de-delphi-7Ismael Batista
 
Continuacion ejemplo de base de datos y reports con jasper report
Continuacion ejemplo de base de datos y reports con jasper reportContinuacion ejemplo de base de datos y reports con jasper report
Continuacion ejemplo de base de datos y reports con jasper reportjbersosa
 
Fundamentos de visual basic
Fundamentos de visual basicFundamentos de visual basic
Fundamentos de visual basicPedro Montero
 
Guia de Laboratorios 3 - VB.NET 2005
Guia de Laboratorios 3 - VB.NET 2005Guia de Laboratorios 3 - VB.NET 2005
Guia de Laboratorios 3 - VB.NET 2005Jose Ponce
 
Guia de Laboratorios 6 - VB.NET 2005
Guia de Laboratorios 6 - VB.NET 2005Guia de Laboratorios 6 - VB.NET 2005
Guia de Laboratorios 6 - VB.NET 2005Jose Ponce
 
introduccion al desarrollo de aplicaciones en c#
introduccion al desarrollo de aplicaciones en c#introduccion al desarrollo de aplicaciones en c#
introduccion al desarrollo de aplicaciones en c#Eduardo Carrillo
 
Visual Basic 6.0
Visual Basic 6.0Visual Basic 6.0
Visual Basic 6.0patrimoni
 
Manual acceso a datos vb.net
Manual acceso a datos vb.netManual acceso a datos vb.net
Manual acceso a datos vb.netcedido
 

La actualidad más candente (20)

Visual Basic 6.0
Visual Basic 6.0Visual Basic 6.0
Visual Basic 6.0
 
Loreidys gonzales fundamentos de visual basic
Loreidys gonzales fundamentos de visual basicLoreidys gonzales fundamentos de visual basic
Loreidys gonzales fundamentos de visual basic
 
Guia bootstrap
Guia bootstrapGuia bootstrap
Guia bootstrap
 
Windows.forms.ejercicios
Windows.forms.ejerciciosWindows.forms.ejercicios
Windows.forms.ejercicios
 
Base de datos con Netbeans
Base de datos con NetbeansBase de datos con Netbeans
Base de datos con Netbeans
 
Visual y sql
Visual y sqlVisual y sql
Visual y sql
 
56874982 curso-de-delphi-7
56874982 curso-de-delphi-756874982 curso-de-delphi-7
56874982 curso-de-delphi-7
 
Visual Basic
Visual BasicVisual Basic
Visual Basic
 
Continuacion ejemplo de base de datos y reports con jasper report
Continuacion ejemplo de base de datos y reports con jasper reportContinuacion ejemplo de base de datos y reports con jasper report
Continuacion ejemplo de base de datos y reports con jasper report
 
Jueves
JuevesJueves
Jueves
 
Fundamentos de visual basic
Fundamentos de visual basicFundamentos de visual basic
Fundamentos de visual basic
 
Guia de Laboratorios 3 - VB.NET 2005
Guia de Laboratorios 3 - VB.NET 2005Guia de Laboratorios 3 - VB.NET 2005
Guia de Laboratorios 3 - VB.NET 2005
 
Guia de Laboratorios 6 - VB.NET 2005
Guia de Laboratorios 6 - VB.NET 2005Guia de Laboratorios 6 - VB.NET 2005
Guia de Laboratorios 6 - VB.NET 2005
 
Visual basic 1º Año
Visual basic  1º AñoVisual basic  1º Año
Visual basic 1º Año
 
introduccion al desarrollo de aplicaciones en c#
introduccion al desarrollo de aplicaciones en c#introduccion al desarrollo de aplicaciones en c#
introduccion al desarrollo de aplicaciones en c#
 
Visual Basic 6.0
Visual Basic 6.0Visual Basic 6.0
Visual Basic 6.0
 
Caraline Cañas
Caraline CañasCaraline Cañas
Caraline Cañas
 
Labo 2
Labo 2Labo 2
Labo 2
 
Manual acceso a datos vb.net
Manual acceso a datos vb.netManual acceso a datos vb.net
Manual acceso a datos vb.net
 
Maria Añez
Maria AñezMaria Añez
Maria Añez
 

Similar a Manual poo-unidad-visual-basic

Similar a Manual poo-unidad-visual-basic (20)

Vn-Desarrollo
Vn-DesarrolloVn-Desarrollo
Vn-Desarrollo
 
5poo
5poo5poo
5poo
 
Clase numero 6
Clase numero 6Clase numero 6
Clase numero 6
 
Conceptos java
Conceptos javaConceptos java
Conceptos java
 
Clases en VB
Clases en VBClases en VB
Clases en VB
 
Memch clases lep ii
Memch   clases lep iiMemch   clases lep ii
Memch clases lep ii
 
programacion orientada a objetos en visual basic net
programacion orientada a objetos en visual basic netprogramacion orientada a objetos en visual basic net
programacion orientada a objetos en visual basic net
 
Java class library
Java class libraryJava class library
Java class library
 
_Concepto de interfaz_interfaz_interfaz_interfaz_interfaz_.pptx
_Concepto de interfaz_interfaz_interfaz_interfaz_interfaz_.pptx_Concepto de interfaz_interfaz_interfaz_interfaz_interfaz_.pptx
_Concepto de interfaz_interfaz_interfaz_interfaz_interfaz_.pptx
 
10-programacion-orientada-a-objetos.ppt
10-programacion-orientada-a-objetos.ppt10-programacion-orientada-a-objetos.ppt
10-programacion-orientada-a-objetos.ppt
 
Framework .NET 3.5 07 Programación orientada a objetos
Framework .NET 3.5 07 Programación orientada a objetosFramework .NET 3.5 07 Programación orientada a objetos
Framework .NET 3.5 07 Programación orientada a objetos
 
Programacion Orientada a Obejtos C++
Programacion Orientada a Obejtos C++Programacion Orientada a Obejtos C++
Programacion Orientada a Obejtos C++
 
Benita ppp unidad 1
Benita ppp unidad 1Benita ppp unidad 1
Benita ppp unidad 1
 
Sesion 07 nivel_acceso_miembros_clases
Sesion 07 nivel_acceso_miembros_clasesSesion 07 nivel_acceso_miembros_clases
Sesion 07 nivel_acceso_miembros_clases
 
Unidad III epoo
Unidad III epooUnidad III epoo
Unidad III epoo
 
Presentacion de clases en c#
Presentacion de clases en c#Presentacion de clases en c#
Presentacion de clases en c#
 
Clases y funciones_especiales
Clases y funciones_especialesClases y funciones_especiales
Clases y funciones_especiales
 
manual de C#
manual de C#manual de C#
manual de C#
 
Manual c# 2
Manual c# 2Manual c# 2
Manual c# 2
 
Manual de c#
Manual de c#Manual de c#
Manual de c#
 

Manual poo-unidad-visual-basic

  • 1. 119 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua 6.- PROGRAMACIÓN ORIENTADA A OBJETOS (POO) DE VISUAL BASIC.NET Introducción: Todo .NET Framework está basado en clases (u objetos). A diferencia de las versiones anteriores de Visual Basic, la versión .NET de este lenguaje basa su funcionamiento casi exclusivamente en las clases contenidas en .NET Framework, además casi sin ningún tipo de limitación. La POO es una evolución de la programación por procedimientos llamada también estructurada. Se basaba en funciones y procedimientos y el código que controlaba el flujo de las llamadas a estos. En Visual Basic, sobre todo en versiones anteriores se sigue programando mucho así. A veces por desconocimiento y otras por "miedo" no se da el salto a la POO, aunque un programador con experiencia en VB puede hacer magníficas aplicaciones sin utilizar la POO (y sin aprovecharse de sus ventajas), y sobre todo, en un tiempo relativamente reducido. 6.1.-¿Qué es una clase? Los programas de Visual Basic se generan con objetos como formularios y controles. Los objetos también se pueden utilizar para representar cosas reales como personas, equipos informáticos o incluso algo más abstracto, como una cuenta bancaria. Una clase es simplemente una representación de un tipo de objeto. Se puede pensar en ella como un plano que describe el objeto. Así como un plano puede utilizarse para construir varios edificios, una clase podemos usarla para crear varias copias de un objeto. Por ejemplo, el control TextBox lo define una clase TextBox, que define su aspecto y sus funciones. Cada vez que arrastramos un control TextBox a un formulario, realmente está creando una nueva instancia de la clase TextBox. Cada control TextBox es una copia exacta, aunque distinta, de la clase que lo define, la clase TextBox. Puesto que cada objeto es una "instancia" independiente de una clase, la acción de crear una clase se denomina creación de instancias. Hasta ahora hemos agregado los controles TextBox a su formulario arrastrándolos desde el Cuadro de herramientas, pero también puede crear instancias de un objeto TextBox en su código si utiliza la palabra clave New. Dim Textbox1 As New TextBox ¿Qué hay dentro de una clase? Todos los objetos tienen propiedades que describen sus atributos, métodos que definen sus acciones y eventos que definen sus respuestas. Igualmente, la clase que
  • 2. 120 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua define un objeto tiene sus propias propiedades, métodos y eventos (a veces llamados miembros) que se pasan a todas las instancias de esa clase. Por ejemplo, una clase que representa una cuenta bancaria podría tener propiedades como: NumeroCuenta BalanceCuenta Métodos como: CalculaInteres () Eventos : CambioBalance. Una vez creada la instancia de un objeto de cuenta bancaria, puede tener acceso a sus propiedades, métodos y eventos de igual manera que si se tratara de un objeto TextBox. Algunos miembros de una clase son privados; sólo se tiene acceso a ellos mediante código dentro de la clase. Por ejemplo, una clase de cuenta bancaria puede tener un método para calcular un saldo. Lo lógico es permitir que un programa lea ese balance pero no que pueda cambiarlo directamente. Puede ocultar los miembros de una clase si los declara como Private o exponerlos si los declara como Public. También puede permitir el acceso a una propiedad y a la vez impedir que el programa cambie su valor declarándolo como ReadOnly. El código siguiente muestra cómo podría ser una clase CuentaBanco, por ejemplo: 'Declaramos la clase CuentaLimpia Class CuentaLimpia 'La hacemos privada Private NumeroCuenta As String Private BalanceCuenta As Decimal 'Y la ponemos publica para que calcule el balance Public Sub ActualizaBalance() End Sub ReadOnly Property Balance() As Decimal Get Return BalanceCuenta End Get End Property End Class CtaBancaria NumeroCuenta BalanceCuenta CalculaInteres() CambioBalance Hacer click
  • 3. 121 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua 6.2.- Crear la primera clase Una de las mejores razones para utilizar clases es que una vez que ha creado una clase para cierto tipo de objeto, se puede reutilizar esa clase en cualquier proyecto. Por ejemplo, muchos de los programas que escribimos pueden involucrar personas: Un programa de administrador de contactos para los contactos comerciales o un programa para realizar un seguimiento de empleados. Aunque los programas pueden ser considerablemente diferentes, los atributos que se aplican a cada persona serían los mismos. Todas tienen nombre, edad, dirección, número de teléfono, etc. Para empezar a ver mejor crear clases,y usarlas crearemos una clase que represente a una persona; Podemos guardar esta clase y utilizarla en otros programas que escribamos en el futuro. Las clases se pueden crear de tres maneras: como parte del código en un módulo de formulario en un proyecto de aplicación para Windows, como un módulo de clase separado agregado a un proyecto de aplicación para Windows o como un proyecto de bibliotecas de clase independiente. Crear clases Al hacer doble clic en un formulario y abrir el Editor de código se ve algo parecido a lo siguiente: Public Class Form1 Private Sub Form1_Load... … End Sub End Class Podemos observar que el formulario realmente es una clase, marcada por instrucciones Class y End Class y cualquier código que se haya escrito entre las dos instrucciones es parte de la clase. Aunque de manera predeterminada un módulo de formulario contiene sólo una clase única, puede crear módulos adicionales agregando código debajo de la instrucción End Class, tal como se ilustra a continuación: Public Class Form1 ' El código de vuestro Form AQUI End Class Public Class MyFirstClass ' El código de vuestra clase AQUI End Class La desventaja de crear clases de esta manera es que sólo están disponibles dentro del proyecto donde se crearon. Si deseamos compartir una clase con otros proyectos, puede colocarla en un módulo de clase.
  • 4. 122 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Módulos de clase Un módulo de clase es un archivo de código, separado del resto, que contiene una o más clases. Como es un archivo independiente, se puede reutilizar en otros proyectos. Los módulos de clase se pueden crear de dos maneras: Como un módulo agregado a un proyecto de aplicación para Windows. Como un proyecto de bibliotecas de clase independient Puede agregar un nuevo módulo de clase a un proyecto existente seleccionando Clase en el cuadro de diálogo Agregar nuevo elemento, disponible en el menú Proyecto. Para trabajar en durante el tutorial, crearemos un proyecto de bibliotecas de clases independientes. Vamos a ver cómo crear un proyecto de de biblioteca de clases: En el menú Archivo, seleccionamos Nuevo proyecto. En el panel Plantillas, del cuadro de diálogo Nuevo proyecto, hacemos clic en Biblioteca de clases. En el cuadro Nombre, escribimos Persons y hacemos clic en Aceptar. Se abrirá un nuevo proyecto de bibliotecas de clase y el Editor de código mostrará el módulo de clase Class1.vb.
  • 5. 123 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua En el Explorador de soluciones, hacemos clic con el botón secundario del ratón en Class1.vb y seleccionamos Cambiar nombre y, a continuación, cambiamos el nombre a "Persons.vb". Observamos que el nombre en el Editor de código también cambia a Persons.vb. En el menú Archivo, elegimos Guardar todo. En el cuadro de diálogo Guardar proyecto, hacemos clic en Guardar. Nota: En lugar de guardar el proyecto en la ubicación predeterminada, podríamos crear un directorio en el cual podemos almacenar todas las clases para reutilizarlas mas tarde. se puede especificar esa carpeta en el campo Location del cuadro de diálogo Guardar proyecto antes de guardar. De momento, mantendremos el proyecto abierto, porque lo utilizaremos durante todo el tutorial, e iremos ampliando la información. Agregar propiedades a una clase Ahora, aprenderemos a agregar propiedades a la clase que creamos en la sección anterior. Todos los objetos tienen atributos y las propiedades representan atributos. Antes, hicimos la clase "Persons", que representa a una persona; las personas tienen atributos como el nombre y la edad, por lo que la clase Persons necesita propiedades que representen dichos atributos. Se pueden agregar propiedades a una clase de dos maneras:
  • 6. 124 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Como campo. Como procedimiento de propiedad. También podemos determinar cómo funciona una propiedad utilizando los modificadores Public, ReadOnly o WriteOnly. Campos y procedimientos de propiedad Los campos son variables públicas dentro de una clase que se pueden establecer o leer desde fuera de la clase. Resultan de utilidad para propiedades que no se tienen que validar, por ejemplo, un valor "Boolean" (True o False). En el caso de la clase Personas, se puede tener una propiedad Boolean denominada Casado, que especifica si una persona está soltera o casada, puesto que hay sólo dos valores posibles. Para agregar un campo a una clase, el código podría ser como el que sigue. Public Casado As Boolean La mayoría de las propiedades, sin embargo, son más complejas; en la mayor parte de los casos utilizaremos procedimientos de propiedad para agregar una propiedad a una clase. Los procedimientos de propiedad tienen tres partes: Una declaración de una variable privada para almacenar el valor de la propiedad. Un procedimiento Get que expone el valor. Un procedimiento Set que, como indica su nombre, establece el valor en la clase. Por ejemplo, un procedimiento de propiedad para una propiedad Name, de la clase Personas, podría ser como el que sigue: Private ValorNombre As String Public Property Nombre() As String Get Nombre = ValorNombre End Get Set(ByVal valor As String) ValorNombre = valor End Set End Property Recibe el dato en la variable ValorNombre de La clase Devuelve el contenido de la variable ValorNombre
  • 7. 125 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua La primera línea de código declara una variable String privada, ValorNombre que almacenará el valor de la propiedad. El procedimiento de propiedad en sí comienza con Public Property y termina con End Property. El procedimiento Get contiene el código que se ejecutará cuando desee leer su valor; por ejemplo, si lee la propiedad Personas.Nombre, el código devolverá el valor almacenado en la variable ValorNombre El procedimiento Set contiene código que se utiliza para asignar un nuevo valor a la variable ValorNombre usando un valor pasado como argumento Valor. Por ejemplo, si escribimos el código Personas.Nombre = "Wyrm" El valor String Wyrm se pasará como argumento Valor; el código del procedimiento Set lo asignará a la variable ValorNombre para su almacenamiento. ¿Por qué complicarnos tanto, en lugar de utilizar un campo que represente la propiedad Nombre? En el mundo real, hay ciertas reglas para los nombres: por ejemplo, los nombres normalmente no contienen números. Puede agregar código al procedimiento Set para comprobar el argumento Valor y devolver un error si contiene números. Siguiendo con la Clase Personas, ahora agregaremos un campo y tres propiedades: 1. Abrimos el proyecto Personas que hicimos en la sección anterior. Si no lo guardaste, primero deberás regresar a la sección anterior, crear la primera clase, y realizar hasta el final los procedimientos de esa sección. 2. En el Explorador de soluciones, seleccionamos Personas.vb y en el menú Ver elegimos Código. 3. Agregamos el siguiente código de declaración debajo de la línea Public Class Personas.
  • 8. 126 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Private ValorPrimerNombre As String Private ValorSegundoNombre As String Private ValorApellido As String Public Casado As Boolean 4. Agregamos los siguientes procedimientos de propiedad debajo del código de declaración anterior. Public Property PrimerNombre() As String Get PrimerNombre = ValorPrimerNombre End Get Set(ByVal valor As String) ValorPrimerNombre = Valor End Set End Property Public Property SegundoNombre() As String Get SegundoNombre = ValorSegundoNombre End Get Set(ByVal valor As String) ValorSegundoNombre = Valor End Set End Property Public Property Apellido() As String Get Apellido = ValorApellido End Get Set(ByVal valor As String) ValorApellido = Valor End Set End Property Quedará así: 5. En el menú Archivo, elegimos Guardar todo para guardar el trabajo. Propiedades de sólo lectura y escritura A veces una propiedad se establece una vez y no cambia nunca mas durante la ejecución del programa. Por ejemplo, una propiedad que representa un número de empleado nunca debe cambiar, de modo que otro programa si lo pueda leer, pero no se permitirá que ese programa cambie su valor. La palabra clave ReadOnly se utiliza para especificar que un valor de propiedad se pueda leer pero no modificar.
  • 9. 127 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Nota: Si intentamos asignar un valor a una propiedad ReadOnly, aparecerá un error en el Editor de código. Para crear una propiedad de sólo lectura, deberemos crear un procedimiento de propiedad con un procedimiento Get, pero sin procedimiento Set, como se muestra a continuación. Private IDValue As Integer ReadOnly Property ID() As Integer Get ID = IDValue End Get End Property De igual forma, la palabra clave WriteOnly permite establecer un valor de propiedad pero no permite que se lea; por ejemplo, no permite que otros programas lean una propiedad de contraseña. Podemos utilizar ese valor para realizar acciones dentro de la clase, pero deseará que sigan siendo privadas. Para crear una propiedad de sólo escritura, se creará una propiedad con un procedimiento Set pero sin procedimiento Get, como a continuación: Private passwordValue As String WriteOnly Property Password() As String Set(ByVal value As String) passwordValue = value End Set End Property Los procedimientos de propiedad ReadOnly y WriteOnly también son útiles cuando deseamos tomar un valor de propiedad y convertirlo en un valor diferente. Por ejemplo, pensemos en la edad de una persona. A diferencia del nombre, la edad cambia con el tiempo, si ha asignado la edad a una clase y la lee de nuevo un año después, sería incorrecta. En la clase Persons, podemos evitarlo agregando dos propiedades: una propiedad "WriteOnly BirthYear" que representa el año de nacimiento, que nunca cambia, y una propiedad "ReadOnly Age" que devuelve un valor calculando la diferencia entre el año en curso y el año de nacimiento. Siguiendo con la Clase Persons, ahora agregaremos propiedades ReadOnly y WriteOnly a la clase: 1. Agregamos el siguiente código de declaración debajo de las otras declaraciones en la parte superior del módulo de clase. Private birthYearValue As Integer
  • 10. 128 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua 2. Introducimos los siguientes procedimientos de propiedad debajo del código de declaración. WriteOnly Property BirthYear() As Integer Set(ByVal value As Integer) birthYearValue = value End Set End Property ReadOnly Property Age() As String Get Age = My.Computer.Clock.LocalTime.Year – birthYearValue End Get End Property 3. En el menú Archivo, elegimos Guardar todo para guardar el trabajo. 6.4.- Agregar métodos a una clase Agregaremos métodos a una clase, para que puedan realizar acciones. Vimos que la mayoría de los objetos tienen acciones que pueden realizar; estas acciones se conocen como métodos. La clase Persons que creamos en la sección anterior,tiene muchas acciones que pueden realizar las personas y, estas acciones se pueden expresar como métodos de clase. Métodos de una clase Los métodos de una clase son simplemente procedimientos Sub o Function, declarados en la clase. Por ejemplo, una clase Cuenta puede tener un procedimiento Sub denominado Recalcular, que actualizará el balance o un procedimiento Function denominado CurrentBalance para devolver el último balance. El código para declarar esos métodos puede ser similar al siguiente: Public Sub Recalcular() 'Aqui el codigo para recalcular Cuenta. End Sub Ejemplo: Public Function BalanceCuenta(ByVal AccountNumber As Integer) As Double 'Codigo para volver a Balance End Function
  • 11. 129 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Si bien la mayoría de los métodos de clase son públicos, también se pueden agregar métodos que sólo la clase en sí puede utilizar. Por ejemplo, la clase Personas puede tener su propia función para calcular la edad de una persona. Si declara la función como Private, no se puede ver o llamar desde fuera de la clase. El código para una función privada puede ser similar a éste otro: Private Function CalcuEdad(ByVal year As Integer) As Integer CalcuAge = My.Computer.Clock.LocalTime.Year - year End Function Más tarde podremos cambiar el código que calcula el valor CalcAge y el método seguirá funcionando bien sin cambiar ningún código que utilice el método. Ocultar el código que realiza el método, se conoce como la "encapsulación", ya explicada al comienzo. Ahora, para agregar un método a la clase Persons, hacemos lo siguiente: Abrimos el proyecto Personas (si no lo tenemos abierto ya de antes) que hicimos en las secciones anteriores. Si no lo guardaste, o no lo creaste, primero deberás volver a las secciones anteriores, agregar propiedades a la clase, y completar los procedimientos. En el Explorador de soluciones, seleccionamos Personas.vb y, en el menú Ver, hacemos clic en Código. Agregamos el siguiente código bajo los procedimientos de propiedad. Public Function NombreComplet() As String If ValorSegundoNombre <> "" Then NombreCompleto = ValorPrimerNombre & " " & ValorSegundoNombre & " " & ValorApellido Else NombreCompleto = ValorPrimerNombre & " " & ValorApellido End If End Function Private Function CalcuEdad(ByVal year As Integer) As Integer CalcuEdad = My.Computer.Clock.LocalTime.Year - year End Function Modificamos el código en el procedimiento de la propiedad Age para utilizar la función privada: ReadOnly Property Age() As String Get 'Age = My.Computer.Clock.LocalTime.Year – birthDateValue
  • 12. 130 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Age = CalcuEdad(birthYearValue) End Get End Property Antes, el código era así: ReadOnly Property Age() As String Get Age = My.Computer.Clock.LocalTime.Year – birthYearValue End Get End Property En el menú Archivo, hacemos clic en Guardar todo para guardar el trabajo. 6.5.- Agregar eventos a una clase Un programa puede responder a eventos externos, como por ejemplo, un usuario que hace clic en un botón. En esta sección, obtendremos información sobre cómo agregar eventos a una clase. Primero, debemos declarar el evento. A continuación, debemos provocarlo. Provocar un evento significa que estamos señalizando la aparición del evento. Para agregar un evento a una clase, lo declaramos con la instrucción Event. Ésto indica que el objeto puede provocar el evento que especificamos. Por ejemplo, quizás deseemos agregar un evento AgeCalculated a la clase Persons que hicimos. Podemos provocar a continuación el evento en el método CalcAge. Después de hacer esto, cuando se llama al método, podemos ejecutar algún código adicional en cuanto se haya calculado la edad de la persona. Para agregar un evento a la clase Persons Abrimos el proyecto Persons. En el Explorador de soluciones, seleccione Persons.vb y, en el menú Ver, hacemos clic en Código. Agregamos el siguiente código encima de los procedimientos de propiedad.
  • 13. 131 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Public Event AgeCalculated(ByVal Age As Single) En el método CalcAge, reemplazamos el código existente por el siguiente código para provocar el evento. Private Function CalcAge(ByVal year As Integer) As Integer Dim Age = My.Computer.Clock.LocalTime.Year - year RaiseEvent AgeCalculated(Age) CalcAge = My.Computer.Clock.LocalTime.Year - year End Function En el menú Archivo, hacemos clic en Guardar todo para guardar el trabajo. Probar una clase Creamos una clase llamada "Persons" y le proporcionamos propiedades, métodos y eventos. Lo que hemos hecho hasta ahora es agregar código, ahora es el momento de utilizar la clase Persons y asegurarse de que funciona según lo esperado. 6.6.- Crear una instancia de una clase Los formularios y controles son en realidad clases; cuando arrastramos un control Button a un formulario, estamos creando realmente una instancia de la clase Button. También podemos crear instancias de cualquier clase en el código utilizando una declaración con la palabra clave New. Por ejemplo, para crear una nueva instancia de la clase Button, agregaremos el código siguiente. Dim aButton As New Button Para utilizar y probar la clase Persons, debemos crear primero un proyecto de prueba y agregar una referencia al módulo de clase. Para crear un proyecto de prueba para la clase Persons Abrimos el proyecto Persons que creamos en las secciones anteriores. En el menú Archivo, elegimos Agregar y, a continuación, hacemos clic en Nuevo proyecto.
  • 14. 132 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua En el panel Plantillas, en el cuadro de diálogo Nuevo proyecto, hacemos clic en Aplicación de Windows Forms. En el cuadro Nombre, escribimos PersonsTest y hacemos clic en Aceptar. Se agregará un nuevo proyecto de Windows Forms al Explorador de soluciones y aparecerá un nuevo formulario.
  • 15. 133 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua En el Explorador de soluciones, seleccionamos el proyecto PersonsTest y, en el menú Proyecto, hacemos clic en Establecer como proyecto de inicio. En el Explorador de soluciones, seleccionamos el proyecto PersonsTest y, en el menú Proyecto, hacemos clic en Agregar referencia. Aparecerá el cuadro de diálogo Agregar referencia. Hacemos clic en la ficha Proyectos, seleccionamos Personas y hacemos clic en Aceptar.
  • 16. 134 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Hacemos doble clic en el formulario para abrir el editor de código y escribimos la siguiente declaración justo debajo de la línea Public Class Form1. Dim person1 As New Persons.Persons Esto declara una nueva instancia de la clase Persons. Quizás os preguntéis por qué tuvimos que escribir dos veces Persons, pues porque la primera instancia es el módulo de clase Persons.vb y la segunda instancia es la clase Persons de ese módulo. En el menú Archivo, hacemos clic en Guardar todo. El siguiente paso es agregar una interfaz de usuario y un código que utilice la clase Persons. Agregaremos cuadros de texto donde el usuario especificará los valores para cada una de las propiedades (excepto la propiedad de sólo lectura "Age"), una casilla para el campo "Married" y botones para probar cada uno de los métodos públicos. Para probar la clase Persons: En el Explorador de soluciones, seleccionamos Form1 y, en el menú Ver, hacemos clic en Diseñador. En el Cuadro de herramientas, arrastramos cuatro controles TextBox, un control CheckBox y dos controles Button al formulario.
  • 17. 135 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Seleccionamos el primer control Button y, a continuación, en la ventana Propiedades establecemos la propiedad Text en Update. Seleccionamos el segundo control Button y en la ventana Propiedades establecemos la propiedad Text en Full Name. Hacemos doble clic en el primer botón (Update) para abrir el Editor de código y en el controlador de eventos Button1_Click, agregamos el siguiente código: With person1 .FirstName = Textbox1.Text .MiddleName = Textbox2.Text .LastName = Textbox3.Text .BirthYear = Textbox4.Text .Married = CheckBox1.Checked End With En el controlador de eventos Button2_Click, agregamos lo siguiente: MsgBox(person1.NombreCompleto) MsgBox(CStr(person1.Edad) & " años") If person1.Casado = True Then MsgBox(person1.PrimerNombre & " es casado") Else MsgBox(person1.Primernombre & " es soltero") End If Presionamos F5 para ejecutar el proyecto y mostrar el formulario: -En el primer cuadro de texto, escribimos nuestro nombre. -En el segundo cuadro de texto, escribimos nuestro segundo nombre. -En el tercer cuadro de texto, escribimos nuestro apellido. -En el cuarto cuadro de texto, escribimos el año de nuestro nacimiento con cuatro dígitos (por ejemplo, 1983). -Activamos la casilla de si estamos casados/as.
  • 18. 136 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Hacemos clic en el botón "Update" para establecer las propiedades de la clase y clic en el botón "Full Name". Se muestran tres cuadros de mensaje. Estos cuadros de mensaje muestran su nombre completo, edad y estado civil. En el menú Archivo, hacemos clic en Guardar todo. 6.7.-Cómo utilizar los constructores Introducción En Visual Basic .NET, la inicialización de nuevos objetos se controla utilizando constructores. Para crear un constructor para una clase, se crea un procedimiento denominado Sub New en cualquier lugar de la definición de la clase. Características de Sub New El constructor Sub New tiene las siguientes características: El código del bloque Sub New siempre se ejecutará antes de cualquier otro código de una clase.
  • 19. 137 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua El constructor Sub New solo se ejecutará una vez, cuando se cree un objeto. Ejemplo de Sub New El siguiente ejemplo muestra cómo utilizar el constructor Sub New: Public Sub New( ) ' Perform simple inicialización intValue = 1 End Sub La siguiente línea de código crea un objeto desde una clase denominada BankAccount, ya definida en la aplicación. Dim myAccount As New BankAccount( ) Podemos sobrecargar New y crear tantos constructores de clases como sean necesarios. Esto resulta útil si deseamos inicializar nuestro objeto cuando lo creemos. Sobrecarga de constructores Podemos sobrecargar constructores del mismo modo que se sobrecarga cualquier otro método de una clase. No obstante, no podemos utilizar la palabra clave Overloads cuando sobrecargamos constructores. El siguiente ejemplo muestra cómo sobrecargar New y crear múltiples constructores de clase: Class BankAccount Private balance as Double Sub New( ) ' Initialize balance balance = 0.0 End Sub Sub New(ByVal amount As Double) balance = amount End Sub End Class Uno de los constructores del ejemplo anterior toma un parámetro. Si estamos creando un objeto desde tal clase, podemos incluir sus parámetros en la declaración. El siguiente ejemplo muestra cómo invocar el método New que toma un parámetro. Dim myAccount As New BankAccount(120.00) Para escribir nuestros propios constructores de clase, crearemos un método con el nombre New( ), como vemos en el Código. En dicho ejemplo, al instanciarse un objeto de la clase Empleado, se asignará a una de sus propiedades la fecha actual. Interfase grafica cliente Public class form1….. Private Sub Botton_Click … Dim loEmp As Empleado loEmp = New Empleado()
  • 20. 138 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua MsgBox("El objeto se ha creado el día "& loEmp.FechaCrea) End Sub End class Public Class Empleado Private mdtFechaCrea As Date Public Property FechaCrea() As Date Get Return mdtFechaCrea End Get Set(ByVal Value As Date) mdtFechaCrea = Value End Set End Property ' método constructor Public Sub New() ' asignamos un valor inicial a una variable de propiedad Me.FechaCrea = Now End Sub End Class Al igual que ocurre en un método normal, New( ) admite parámetros; esto nos sirve para asignar valores de inicio al objeto en el momento de su instanciación. La denominación para este tipo de métodos es constructor parametrizado. El Código nos muestra una variación del fuente anterior, utilizando un constructor de este tipo. Interfase grafica cliente Public class form1….. Private Sub Botton_Click … Dim loEmp As Empleado loEmp = New Empleado("5/7/2002") MsgBox("El objeto se ha creado el día "& loEmp.FechaCrea) ' este es otro modo de instanciar ' un objeto con un constructor parametrizado Dim loEmp2 As New Empleado("08/4/2002") End Sub End Class Public Class Empleado Private mdtFechaCrea Public Property FechaCrea() As Date Get Return mdtFechaCrea End Get Set(ByVal Value As Date)
  • 21. 139 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua mdtFechaCrea = Value End Set End Property ' método constructor con parámetro Public Sub New(ByVal ldtFecha As Date) ' asignamos el valor del parámetro a una variable de propiedad Me.FechaCrea = ldtFecha End Sub End Class Combinando las características de métodos constructores junto a las de sobrecarga, podemos crear un conjunto de constructores sobrecargados para la clase. Public Class Empleado Public psNombre Public psApellidos Public psCiudad Private mdtFechaCre ' en este constructor sin parámetros, asignamos la fecha actual Public Sub New() mdtFechaCrea = Now() End Sub ' en este constructor, asignamos valores a todos los campos de la clase Public Sub New(ByVal lsNombre As String, ByVal lsApellidos As String, ByVal lsCiudad As String) psNombre = lsNombre psApellidos = lsApellidos psCiudad = lsCiudad End Sub End Class 6.8.-Cómo utilizar los destructores Introducción En Visual Basic .NET, podemos controlar qué ocurre durante la destrucción de objetos utilizando procedimientos denominados destructores. Finalize y Dispose El sistema invoca al destructor Finalize antes de liberar el objeto. Puede utilizarse para limpiar recursos abiertos, como conexiones a bases de datos, o para liberar otros
  • 22. 140 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua recursos. Sin embargo, existe una demora entre el momento en que un objeto pierde su alcance y el momento en que se invoca al destructor Finalize. La ejecución de Sub Finalize provoca una ligera pérdida en el rendimiento, por ello únicamente debería definirse un método Sub Finalize cuando sea necesario liberar objetos explícitamente. Visual Basic .NET permite un segundo tipo de destructor, denominado Dispose, que puede ser invocado explícitamente en cualquier momento para liberar recursos de forma inmediata. Dispose no se incluye en el ámbito de este curso. Si desea más información sobre Dispose, puede consultar “Duración de los objetos: cómo se crean y destruyen” en la documentación de Visual Studio .NET. Nota Ejemplo de Sub Finalize El siguiente ejemplo muestra cómo utilizar el destructor Finalize: Protected Overrides Sub Finalize( ) ' Can close connections or other resources conn.Close End Sub Protected es un modificador de acceso que establece el nivel de accesibilidad. 6.9.-Cómo utilizar miembros de datos compartidos Introducción En Visual Basic .NET, los miembros de datos compartidos pueden utilizarse para permitir que múltiples instancias de una clase hagan referencia a una única variable a nivel de clase. Sintaxis Utilizaremos la siguiente sintaxis para declarar miembros de datos compartidos: NiveldeAcceso Shared MiembrodeDatos As TipodeDatos Niveles de acceso Los miembros de datos compartidos están directamente enlazados a la clase, y podemos declararlos como públicos o privados. Si declaramos los miembros de datos como públicos, estarán accesibles para cualquier código que pueda acceder a la clase. Si declaramos los miembros de datos como privados, proporcionaremos propiedades compartidas públicas para acceder a la propiedad compartida privada. Ejemplo El siguiente ejemplo muestra cómo crear una clase de cuenta de ahorro (SavingsAccount) que utilice un miembro de datos compartido público para mantener los tipos de interés para una cuenta de ahorro:
  • 23. 141 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Class SavingsAccount Public Shared InterestRate As Double Public Function CalculateInterest( ) As Double ... End Function End Class El valor del miembro de datos InterestRate de la clase SavingsAccount puede establecerse globalmente con independencia del número de instancias de la clase que estén en uso. El valor se utiliza para calcular el interés del saldo actual. Invocar miembros de datos compartidos desde un cliente Después de crear una clase que utilice miembros de datos compartidos públicos, podemos invocar los miembros de datos de esa clase desde una aplicación cliente. El siguiente código muestra cómo invocar la clase SavingsAccount y sus miembros de datos desde una aplicación cliente: Sub Test( ) SavingsAccount.InterestRate = 0.03 Dim myAccount As New SavingsAccount( ) Dim yourAccount As New SavingsAccount( ) MessageBox.Show(myAccount.CalculateInterest( )) MessageBox.Show(yourAccount.CalculateInterest( )) End Sub En el examen de este código, se observa lo siguiente: InterestRate puede establecerse antes y después de la creación de cualquier instancia de la clase SavingsAccount. Cualquier modificación a InterestRate se aplicará a todas las instancias de la clase SavingsAccount. Propiedades compartidas También pueden crearse propiedades compartidas en las clases. El siguiente ejemplo muestra cómo declarar una propiedad compartida denominada Rate en la clase SavingsAccount: Class SavingsAccount Private Shared interestRate As Double Shared Property Rate( ) As Double Get Return interestRate End Get Set(ByVal Value As Double) interestRate = Value End Set End Property End Class
  • 24. 142 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Invocar propiedades compartidas desde un cliente Una vez declarada la propiedad compartida Rate, puede utilizarse en una aplicación cliente en lugar de acceder directamente al miembro de datos compartido interestRate. Podemos invocar una propiedad compartida cualificándola con el nombre de clase o con el nombre de variable de una instancia específica de la clase. El siguiente código muestra cómo invocar una propiedad compartida cualificándola con el nombre de la clase: SavingsAccount.Rate = 0.03 El siguiente código muestra cómo invocar una propiedad compartida utilizando el nombre de variable de una instancia específica de la clase: 6.10.-Cómo utilizar los métodos compartidos Introducción Podemos utilizar los miembros de procedimiento compartidos para diseñar funciones que pueden ser invocadas sin crear una instancia de la clase. Los procedimientos compartidos son métodos de una clase que no están asociados a una instancia específica de una clase. Los miembros de procedimiento compartidos únicamente pueden acceder a datos marcados con la palabra clave Shared. Por ejemplo, un método compartido no puede hacer referencia a un miembro de la instancia de una clase. Ejemplo del uso de un miembro de procedimiento compartido El siguiente ejemplo muestra cómo una función utilizada habitualmente, como GetComputerName, puede crearse como un miembro de procedimiento compartido de forma que una aplicación cliente puede utilizarla fácilmente. El cliente únicamente necesita hacer referencia al método prefijado por el nombre de la clase, ya que no se requiere ninguna instancia de la clase. ' TestClass code Public Shared Function GetComputerName( ) As String ... End Function ' Client code MessageBox.Show(TestClass.GetComputerName( )) Observaremos también que, en el código anterior, Show es un método compartido de la clase MessageBox.
  • 25. 143 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua 6.11.-¿Qué es el polimorfismo? Introducción La mayoría de sistemas de programación orientada a objetos proporcionan polimorfismo mediante herencia. El polimorfismo basado en herencia implica la definición de métodos en una clase base y sobrecargarlos con nuevas implementaciones en clases derivadas. Definición Polimorfismo hace referencia a la capacidad de definir múltiples clases con diferentes funcionalidades pero con métodos o propiedades de nombres idénticos que pueden utilizarse de forma intercambiable por el código cliente en tiempo de ejecución. El nombre del método reside en la clase base. Las implementaciones de métodos residen en las clases derivadas. Para gestionar esto, únicamente puede declararse en la clase base el nombre del método (no el código que proporciona la funcionalidad del método). Ejemplo de polimorfismo Supongamos que definimos una clase denominada BaseTax que proporciona funcionalidad básica para calcular el impuesto sobre las ventas de un estado. Las clases derivadas de BaseTax, como CountyTax o CityTax, podrían implementar métodos como CalculateTax. Polimorfismo hace referencia al hecho de que la implementación del método CalculateTax podría ser distinta en cada una de las clases derivadas. Por ejemplo, el tipo impositivo de un condado (county tax rate) podría ser distinto del tipo impositivo de una ciudad (city tax rate). Las clases que hereden de BaseTax tendrán un método CalculateTax, pero el modo como se calcule realmente el impuesto podría variar en cada una de las clases derivadas. Sobrecarga de métodos o polimorfismo, en una misma clase La sobrecarga de métodos, es una técnica que consiste en crear varios métodos con idéntico nombre dentro de la misma clase, distinguiéndose entre sí por su lista de parámetros. Analicemos el siguiente ejemplo: Interfase grafica cliente Public class form1….. Private Sub Botton_Click … Dim loEmpleado As New Empleado() Dim ldbResultadoIncent As Double loEmpleado.Salario = 1020.82 'llamada al primer método sobrecargado loEmpleado.Sueldo()
  • 26. 144 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua 'llamada al segundo método sobrecargado MsgBox("El sueldo se transferirá el día " & loEmpleado.Sueldo(29)) 'llamada al tercer método sobrecargado ldbResultadoIncent = loEmpleado.Sueldo(50.75, "Extras") MsgBox(“El incentivo a pagar será " & ldbResultadoIncent) End Sub End Class Public Class Empleado Private mdbSalario As Double Public Property Salario() As Double Get Return mdbSalario End Get Set(ByVal Value As Double) mdbSalario = Value End Set End Property ' Métodos sobrecargados Public Overloads Sub Sueldo() ' aquí mostramos en consola el importe del sueldo formateado MsgBox("El sueldo es " & Format(Me.Salario, "#,#.##")) End Sub Public Overloads Function Sueldo(ByVal liDia As Integer) As String ' Aquí mostramos la fecha del mes actual en la que se ' realizará la transferencia del sueldo al banco del empleado Dim ldtFechaActual As Date Dim lsFechaCobro As String ldtFechaActual = Now() lsFechaCobro = CStr(liDia) & "/" & _ CStr(Month(ldtFechaActual)) & "/" & _ CStr(Year(ldtFechaActual)) Return lsFechaCobro End Function Public Overloads Function Sueldo(ByVal ldbImporteIncentivo As Double,ByVal lsTipoIncentivo As String) As Double ' aquí calculamos la cantidad de incentivo que se añadirá al ' sueldo del empleado,en función del tipo de incentivo Dim ldbIncentivo As Double
  • 27. 145 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua ' según el tipo de incentivo, se descuenta un importe de la cantidad del ‘ incentivo Select Case lsTipoIncentivo Case "Viajes" ldbIncentivo = ldbImporteIncentivo - 30 Case "Extras" ldbIncentivo = ldbImporteIncentivo - 15 End Select Return ldbIncentivo End Function End Class Métodos sobrecargados Para crear un método sobrecargado, agregamos dos o más procedimientos Sub o Function a la clase, cada uno con el mismo nombre. En las declaraciones de procedimiento, el conjunto de argumentos para cada procedimiento debe ser distinto o se producirá un error. El siguiente ejemplo muestra un método con dos sobrecargas, una que acepta una String y la otra que acepta un Integer como argumentos. Public Sub TestFunction(ByVal input As String) MsgBox(input) End Sub Public Sub TestFunction(ByVal input As Integer) MsgBox(CStr(input)) End Sub Si se debe llamar a este método desde el código y pesarle una cadena, se ejecutaría la primera sobrecarga y un cuadro de mensaje mostraría la cadena; si se le pasó un número, se ejecutaría la segunda sobrecarga y el número se convertiría en una cadena y aparecería en el cuadro de mensaje. Podemos crear tantas sobrecargas como sean necesarias y cada una de ellas puede contener un número diferente de argumentos. En la clase Persons, agregaremos un método con dos sobrecargas para devolver la inicial del segundo nombre de una persona; una sólo con la inicial y la otra con la inicial seguida por un punto. Probar los métodos sobrecargados en la clase Persons Abrimos el proyecto Persons que creamos en la secciones anteriores. En el Explorador de soluciones, seleccionamos Persons.vb y, en el menú Ver, elegimos Código.
  • 28. 146 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Agregamos el siguiente código debajo de los métodos existentes. Public Function MiddleInitial() As String MiddleInitial = Left$(middleNameValue, 1) End Function Public Function MiddleInitial(ByVal period As Boolean) As String MiddleInitial = Left$(middleNameValue, 1) & "." End Function En el Explorador de soluciones, seleccionamos Form1 y, en el menú Ver, hacemos clic en Diseñador. En el Cuadro de herramientas, arrastramos dos controles más de Button al formulario. Seleccionamos el tercer control Button y en la ventana Propiedades establecemos su propiedad Text en With. Seleccionamos el cuarto control Button y en la ventana Propiedades establecemos su propiedad Text en Without. Hacemos doble clic en el primer botón (With) para abrir el Editor de código y escribimos el siguiente código en el controlador de eventos Button3_Click. En el controlador de eventos Button4_Click, agregamos el siguiente código. MsgBox(person1.FirstName & " " & person1.MiddleInitial & _ " " & person1.LastName) Presionamos F5 para ejecutar el proyecto y mostrar el formulario. -En el primer cuadro de texto, escribimos nuestro nombre. -En el segundo cuadro de texto, escribimos nuestro segundo apellido. -En el tercer cuadro de texto, escribimos nuestro tercer apellido. -En el cuarto cuadro de texto, escribimos el año de nuestro nacimiento con cuatro dígitos (por ejemplo, 1983). -Activamos la casilla si está casado/a.
  • 29. 147 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Hacemos clic en el botón Actualizar para establecer las propiedades de la clase y hacemos clic en el botón With. Se abrirá un cuadro de mensaje. Muestra nuestro nombre con un punto tras la inicial del primer apellido. Hacemos clic en el botón Without. Se abrirá un cuadro de mensaje. Muestra nuestro nombre sin el punto tras la inicial del primer apellido.
  • 30. 148 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua En el menú Archivo, hacemos clic en Guardar todo. 6.12.-Probar controladores de eventos Si deseamos escribir código que responda a un evento (o que controle un evento), debemos asociar ese evento a un controlador de eventos. Podemos hacerlo mediante la instrucción Handles o Add Handler. La instrucción Add Handler permite asociar los eventos a los controladores en tiempo de ejecución, mientras que la instrucción Handles sólo asocia los eventos a los controladores en tiempo de compilación. La instrucción Handles se puede agregar al final de cualquier subrutina que tenga la misma firma que el evento. Por ejemplo, antes, agregamos un evento denominado "AgeCalculated" que toma un parámetro de tipo "Integer". La subrutina que crea para controlar el evento también debe tomar un parámetro Integer, como se observa en el código siguiente. Private Sub person1_AgeCalculated(ByVal Age As Integer) _ Handles person1.AgeCalculated El objeto person1 se debe crear con la instrucción WithEvents para que se pueda tener acceso al evento AgeCalculated. Al usar la instrucción Add Handler, puede asociar dinámicamente los eventos a controladores en tiempo de ejecución. Probamos el controlador de eventos en la clase Person En el Explorador de soluciones, seleccionamos Form1 y, en el menú Ver, hacemos clic en Código. Agregamos la instrucción WithEvents antes de la declaración person1, como se muestra en el código siguiente: WithEvents person1 As New Persons.Persons
  • 31. 149 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Agregamos el procedimiento siguiente a Form1. Este código comprueba la edad calculada y muestra un mensaje basado en el resultado. Private Sub person1_AgeCalculated(ByVal Age As Integer) _ Handles person1.AgeCalculated If Age > 18 Then MsgBox("You have been over 18 for " & Age - 18 _ & " years.") Else MsgBox("You will be 18 in " & 18 - Age & " years") End If End Sub Presionamos F5 para ejecutar el proyecto y mostrar el formulario. -En el primer cuadro de texto, escribimos nuestro nombre. -En el segundo cuadro de texto, escribimos nuestro segundo apellido. -En el tercer cuadro de texto, escribimos nuestro tercer apellido. -En el cuarto cuadro de texto, escribimos el año de nuestro nacimiento con cuatro dígitos (por ejemplo, 1983). -Activamos la casilla si está casado/a. Hacemos clic en el botón Actualizar para establecer las propiedades de la clase y haga clic en el botón Full Name. Un cuadro de mensaje muestra su nombre completo. Si tiene más de 18 años, otro cuadro de mensaje muestra información sobre cuánto tiempo hace que cumplió los 18 años. Si tiene menos de 18 años, aparece un cuadro de mensaje que muestra información sobre cuánto tiempo queda hasta que cumpla los 18 años. A continuación, otro cuadro de mensaje muestra su edad.
  • 32. 150 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua En el menú Archivo, hacemos clic en Guardar todo. 6.13.- Herencia en Visual Basic NET La Herencia especifica una relación “es un tipo de” Múltiples clases comparten los mismos atributos y operaciones, permitiendo una eficaz reutilización del código Introducción En la programación orientada a objetos, podemos compartir las características de una clase base en otras clases derivadas de la clase base. Esto se denomina herencia. Definición Herencia es el concepto de reutilizar atributos y operaciones comunes de una clase base en una clase derivada. Cómo heredar de una clase Una clase derivada hereda de una clase base Pueden heredarse propiedades, métodos, miembros de datos, eventos y controladores de eventos (dependiendo del ámbito) Palabras clave Inherits: hereda de una clase base NotInheritable: no es heredable MustInherit: no pueden crearse instancias de la clase; deben heredarse como una clase base Introducción Persona Cliente Empleado Clase base Clase Derivada
  • 33. 151 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua En Visual Basic .NET, la herencia puede utilizarse para derivar una clase de una clase existente. La clase derivada puede heredar todas las propiedades, métodos, miembros de datos, eventos y controladores de eventos de la clase base, facilitando la reutilización de la clase base por toda la aplicación. La palabra clave Inherits La palabra clave Inherits se utiliza para definir una clase derivada que heredará de una clase base existente. Ejemplo: El siguiente ejemplo muestra cómo utilizar la palabra clave Inherits: Public Class CheckingAccount Inherits BankAccount Private Sub ProcessCheck( ) ' Add code to process a check drawn on this account End Sub End Class Observacion Podemos utilizar la palabra clave MyBase para invocar métodos en una clase base cuando invalidan métodos en una clase derivada. También podemos utilizar la palabra clave MyBase para invocar el constructor y el destructor de la clase base en nuestra clase derivada. Observemos el siguiente ejemplo: 'Crear clase derivada en dos líneas Public Class Administrativo Inherits Empleado ' Crear clase derivada en la misma línea Public Class Administrativo : Inherits Empleado La palabra clave NotInheritable La palabra clave NotInheritable se utiliza para definir una clase que no puede utilizarse como clase base para herencia. Si otra clase intenta heredar de esta clase, se generará un error de compilación. Ejemplo: El siguiente ejemplo muestra cómo utilizar la palabra clave NotInheritable: Public NotInheritable Class TestClass ... End Class Public Class DerivedClass ' The following line generates a compiler error Inherits TestClass
  • 34. 152 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua ... End Class La palabra clave MustInherit La palabra clave MustInherit se utiliza para definir clases que no están pensados para ser utilizados directamente como objetos instanciados. La clase resultante debe ser heredada como una clase base para utilizarla en el objeto de una clase derivada instanciada. Ejemplo: El siguiente ejemplo muestra cómo utilizar la palabra clave MustInherit: Public MustInherit Class BaseClass ... End Class ... Si el código cliente intenta crear una instancia de este tipo de clase, se generará un error de compilación, como se muestra en el siguiente ejemplo: ' Client code ' The following line generates a compiler error Dim x As New BaseClass( ) La palabra clave Protected Utilizamos el acceso Protected para limitar el ámbito de una propiedad, método, miembro de datos, evento o controlador de eventos a la clase que los define y cualquier clase derivada basada en esa clase base. Ejemplo El siguiente ejemplo muestra cómo utilizar la palabra clave Protected: Public Class BaseClass ' Accessible anywhere Public counter As Integer ' Accessible only in this class or a derived class Protected name As String ... End Class Generar una clase a partir de una clase existente: Herencia de clases Ahora veremos cómo utilizar la herencia de clases para crear una clase basada en una clase existente. Muchos objetos de la vida real tienen atributos y comportamientos en común, por ejemplo, todos los coches tienen ruedas y motores, y pueden avanzar y detenerse. Sin embargo, algunos automóviles tienen atributos que no son comunes, por ejemplo, un
  • 35. 153 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua descapotable tiene una parte superior que se puede subir/bajar electrónica o manualmente. Si se creó un objeto para representar un automóvil, se pueden incluir propiedades y métodos para todos los atributos y comportamientos comunes, pero no se podrían agregar atributos como la cubierta de un descapotable, puesto que dicho atributo no es generalizable a todos los automóviles. Mediante el uso de la herencia, se puede crear una clase "descapotable" que deriva de la clase "automóvil". Ésta hereda todos los atributos de la clase automóvil y puede agregar los atributos y comportamientos que son únicos de un auto descapotable. Heredar a partir de una clase existente La instrucción Inherits se utiliza para declarar una nueva clase, denominada clase derivada, basada en una clase existente conocida como clase base. Las clases derivadas heredan todas las propiedades, los métodos, los eventos, los campos y las constantes definidos en la clase base. El siguiente código muestra la declaración de una clase derivada. Class DerivedClass Inherits BaseClass … End Class Se pueden crear instancias de la nueva clase DerivedClass, se puede tener acceso a sus propiedades y métodos como BaseClass y se pueden agregar nuevas propiedades y métodos que son específicos de la nueva clase. Para ver un ejemplo, nos fijaremos en la clase Persons que tenemos creada. Supongamos que deseamos tener una clase que represente jugadores de béisbol: los jugadores del béisbol tienen todos los atributos definidos en la clase Persons, pero también tienen atributos únicos, como su número y posición. En lugar de agregar esas propiedades a la clase Persons, se creará una nueva clase derivada que se hereda de Persons, a la que se agregaran las nuevas propiedades. Para crear una clase derivada de la clase Persons: Abrimos el proyecto Persons que llevamos todo el tutorial usando. En el Explorador de soluciones, seleccionamos el nodo del proyecto Persons. En el menú Proyecto, elegimos Agregar clase.
  • 36. 154 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua En el cuadro de diálogo Agregar nuevo elemento, escribimos Players en el cuadro Nombre, a continuación, hacemos clic en Agregar. Se agregará un nuevo módulo de clase al proyecto. En el Editor de código, agregamos lo siguiente justo debajo de la línea Public Class Players. Inherits Persons Agregamos también el siguiente código para definir las dos nuevas propiedades. Private numberValue As Integer Private positionValue As String Public Property Number() As Integer Get Number = numberValue End Get Set(ByVal value As Integer)
  • 37. 155 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua numberValue = value End Set End Property Public Property Position() As String Get Position = positionValue End Get Set(ByVal value As String) positionValue = value End Set End Property En el menú Archivo, hacemos clic en Guardar todo. Probar la clase Players Hemos creado una clase Players, derivada de la clase Persons.Ahora haremos una nueva aplicación para probar la clase Players. Para crear un proyecto de prueba para la clase: 1. En el menú Archivo, elegimos Agregar y, a continuación, hacemos clic en Nuevo proyecto. 2. En el cuadro de diálogo Agregar nuevo proyecto, en el panel Plantillas, seleccionamos una Aplicación de Windows Forms. 3. En el cuadro Nombre, escribimos PlayerTest y hacemos clic en Aceptar. 4. Se agregará un nuevo proyecto de Windows Forms al Explorador de soluciones y aparecerá un nuevo formulario.
  • 38. 156 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua 5. En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el menú Proyecto, hacemos clic en Establecer como proyecto de inicio. 6. En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el menú Proyecto, haga clic en Agregar referencia. 7. Se abrirá el cuadro de diálogo Agregar referencia. 8. Hacemos clic en la ficha Proyectos, elegimos Persons y hacemos clic en Aceptar. 9. Hacemos doble clic en el formulario para abrir el Editor de código y escribimos la siguiente declaración justo debajo de la línea Public Class Form1. Dim player1 As New Persons.Players Dim player2 As New Persons.Players Esto declara dos nuevas instancias de la clase Players. 10. En el menú Archivo, hacemos clic en Guardar todo. Para probar la clase derivada: 1. En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest y, a continuación, en el menú Ver, hacemos clic en Código.
  • 39. 157 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua 2. En el Editor de código, agregamos el siguiente código al procedimiento de evento Form1_Load. With player1 .FirstName = "Wyrm" .LastName = "Garcia" .Number = 13 .Position = "Shortstop" End With With player2 .FirstName = "Joe" .LastName = "Black" .Number = 51 .Position = "Catcher" End With 3. En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest y, a continuación, en el menú Ver, hacemos clic en Diseñador.
  • 40. 158 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua 4. En el Cuadro de herramientas, arrastramos dos controles Button al formulario. 5. Seleccionamos el primer control Button y en la ventana Propiedades establecemos su propiedad Text en At Bat. 6. Seleccionamos el segundo control Button y en la ventana Propiedades establecemos su propiedad Text en On Deck. 7. Hacemos doble clic en el primer botón (At Bat) para abrir el Editor de código y escribimos el siguiente código en el controlador de eventos Button1_Click. MsgBox(player1.Position & " " & player1.FullName & ", #" & CStr(player1.Number) & " is now at bat.") Observamos que estamos utilizando el método FullName que se heredó de la clase base Persons. 8. En el controlador de eventos Button2_Click, agregamos el siguiente código. MsgBox(player2.Position & " " & player2.FullName & ", #" & CStr(player2.Number) & " is on deck.") 9. Presionamos F5 para ejecutar el programa. Hacemos clic en cada botón para ver los resultados. Clic al Boton1(At Bat):
  • 41. 159 MSc. Ing. Jorge J. Prado D. Docente: Univ. Nac. De Ingenieria, Managua Clic al Boton2 (on Deck): 10. En el menú Archivo, elegimos Guardar todo. Hemos visto, qué son y cómo crear clases, agregarle propiedades, métodos y eventos, las hemos heredado, etc. la mejor forma de aprender y de que las cosas se entiendan, es haciéndolo uno mismo...