1. Taller de aplicaciones
de escritorio
2010
III CICLO
TALLER DE APLICACIONES DE ESCRITORIO – VISUAL BASIC .NET
Objetivos:
• Conocer los conceptos básicos de programación orientada a objetos.
• Conocer la creación de objetos y clases.
WINDOWS FORMS
1.- La programación orientada a objetos
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 limitaciones. Debido a esta
dependencia en las clases del .NET Framework y sobre todo a la forma "hereditaria" de usarlas, Visual
Basic .NET tenía que ofrecer esta característica sin ningún tipo de restricciones.
Aunque no soy muy dado a esto de las cosas teóricas, vamos a ver de qué va todo esto de la
programación orientada a objetos y cuáles son las "condiciones" que cualquier lenguaje que se precie
de serlo debe cumplir.
Los tres pilares de la Programación Orientada a Objetos
Según se dice por ahí, cualquier lenguaje basado en objetos debe cumplir estos tres requisitos:
1. Abstracción
2. Herencia
3. Encapsulación
4. Polimorfismo
Abstracción
La abstracción es aquella característica que nos permite identificar un objeto a través de sus aspectos
conceptuales.
Las propiedades de los objetos de una misma clase, pueden hacerlos tan distintos que sea difícil
reconocer que pertenecen a una clase idéntica. No obstante, nosotros reconocemos a qué clase
pertenecen, identificando además, si se trata de la misma clase para ambos. Ello es posible gracias a la
abstracción.
Tomemos como ejemplo dos objetos coche, uno deportivo y otro familiar; su aspecto exterior es muy
diferente, sin embargo, cuando pensamos en cualquiera de ellos, sabemos que ambos pertenecen a la
PROF. MARIO ANTONIO HUAPALLA MORALES 1
2. clase Coche, porque realizamos una abstracción o identificación mental de los elementos comunes que
ambos tienen (ruedas, volante, motor, puertas, etc.).
Del mismo modo que hacemos al identificar objetos reales, la abstracción nos ayuda a la hora de
desarrollar una aplicación, permitiéndonos identificar los objetos que van a formar parte de nuestro
programa, sin necesidad de disponer aún de su implementación; nos basta con reconocer los aspectos
conceptuales que cada objeto debe resolver.
Por ejemplo, cuando abordamos el desarrollo de un programa de gestión orientado a objetos,
realizamos una abstracción de los objetos que necesitaríamos para resolver los procesos del programa:
un objeto Empleado, para gestionar al personal de la empresa; un objeto Factura, para gestionar las
ventas realizadas de productos; un objeto Usuario, para verificar las personas que utilizan la aplicación,
etc.
Encapsulación
La encapsulación establece la separación entre el interfaz del objeto y su implementación,
aportándonos dos ventajas fundamentales.
Por una parte proporciona seguridad al código de la clase, evitando accesos y modificaciones no
deseadas; una clase bien encapsulada no debe permitir la modificación directa de una variable, ni
ejecutar métodos que sean de uso interno para la clase.
Por otro lado la encapsulación simplifica la utilización de los objetos, ya que un programador que use
un objeto, si este está bien diseñado y su código correctamente escrito, no necesitará conocer los
detalles de su implementación, se limitará a utilizarlo.
Tomando un ejemplo real, cuando nosotros utilizamos un objeto Coche, al presionar el acelerador, no
necesitamos conocer la mecánica interna que hace moverse al coche, sabemos que el método Acelerar
del coche es lo que tenemos que utilizar para desplazarnos, y simplemente lo usamos.
Pasando a un ejemplo en programación, si estamos creando un programa de gestión y nos
proporcionan un objeto Cliente que tiene el método Alta, y sirve para añadir nuevos clientes a la base
de datos, no precisamos conocer el código que contiene dicho método, simplemente lo ejecutamos y
damos de alta a los clientes en nuestra aplicación.
Polimorfismo
El polimorfismo determina que el mismo nombre de método, realizará diferentes acciones según el
objeto sobre el que sea aplicado. Al igual que sucedía en la encapsulación, el programador que haga
uso del objeto, no necesita conocer los detalles de implementación de los métodos, se limita a
utilizarlos.
Pasando a un ejemplo real, tomamos dos objetos: Pelota y VasoCristal; si ejecutamos sobre ambos el
método Tirar, el resultado en ambos casos será muy diferente; mientras que el objeto Pelota rebotará
al llegar al suelo, el objeto VasoCristal se romperá.
En un ejemplo aplicado a la programación, supongamos que disponemos de los objetos Ventana y
Fichero; si ejecutamos sobre ambos el método Abrir, el resultado en Ventana será la visualización de
una ventana en el monitor del usuario; mientras que en el objeto Fichero, se tomará un fichero en el
equipo del usuario y se dejará listo para realizar sobre él operaciones de lectura o escritura.
PROF. MARIO ANTONIO HUAPALLA MORALES 2
3. Herencia
Se trata de la característica más importante de la OOP, y establece que partiendo de una clase a la que
denominamos clase base, padre o superclase, creamos una nueva clase denominada clase derivada,
hija, o subclase. En esta clase derivada dispondremos de todo el código de la clase base, más el nuevo
código propio de la clase hija, que escribamos para extender sus funcionalidades.
A su vez podemos tomar una clase derivada, creando una nueva subclase a partir de ella, y así
sucesivamente, componiendo lo que se denomina una jerarquía de clases, que explicaremos
seguidamente.
Existen dos tipos de herencia: simple y múltiple. La herencia simple es aquella en la que creamos una
clase derivada a partir de una sola clase base, mientras que la herencia múltiple nos permite crear una
clase derivada a partir de varias clases base. El entorno de .NET Framework sólo permite utilizar
herencia simple.
Como ejemplo real de herencia, podemos usar la clase Coche como clase base; en ella reconocemos
una serie de propiedades como Motor, Ruedas, Volante, etc., y unos métodos como Arrancar,
Acelerar, Frenar, etc. Como clase derivada creamos CocheDeportivo, en la cuál, además de todas las
características mencionadas para la clase Coche, encontramos propiedades y comportamiento
específicos como ABS, Turbo, etc.
Un ejemplo basado en programación consistiría en disponer de la ya conocida clase Empleado. Esta
clase se ocupa, como ya sabemos, de las operaciones de alta de empleados, pago de nóminas, etc.;
pero en un momento dado, surge la necesidad de realizar pagos a empleados que no trabajan en la
central de la empresa, ya que se trata de comerciales que pasan la mayor parte del tiempo
desplazándose. Para realizar dichos pagos usaremos Internet, necesitando el número de tarjeta de
crédito y la dirección email del empleado. Resolveremos esta situación creando la clase derivada
CiberEmpleado, que hereda de la clase Empleado, en la que sólo tendríamos que añadir las nuevas
propiedades y métodos para las transacciones electrónicas, puesto que las operaciones tradicionales
ya las tendríamos disponibles por el mero hecho de haber heredado de Empleado.
Jerarquías de clases
Como decíamos en un apartado anterior, uno de los fines de la OOP consiste en la clasificación del
código; para ello se emplean jerarquías o árboles de clases, en los que a base de niveles, se muestra un
conjunto de clases conectadas por una relación de herencia. Observemos el esquema de la Figura 192,
en el que se muestra un ejemplo de la jerarquía de clases de medios de transporte.
PROF. MARIO ANTONIO HUAPALLA MORALES 3
4. Creación de clases
Volvamos al ejemplo expuesto al comienzo de este tema, en el cuál, habíamos dejado a nuestro
programador desarrollando los procesos de un empleado dentro de una aplicación de gestión
empresarial. Recordemos que se planteaba el problema de que ante el crecimiento del programa, el
mantenimiento del código, al enfocarse de modo procedural, podía volverse una tarea realmente
difícil.
Vamos a replantear este diseño, encauzándolo bajo una perspectiva orientada a objeto, que nos
permita un uso más sencillo del código y un mantenimiento también más fácil. Para lo cual
desarrollaremos una clase que contenga todas las operaciones a realizar por el empleado; en
definitiva, crearemos la clase Empleado, cuyo proceso describiremos a continuación.
Podemos escribir una clase en VB.NET utilizando diferentes tipos de aplicación, en este caso
emplearemos una aplicación de consola. Iniciaremos en primer lugar VS.NET, creando un proyecto de
tipo consola. A continuación seleccionaremos el menú Proyecto + Agregar clase, que nos mostrará la
ventana para agregar nuevos elementos al proyecto. El nombre por defecto asignado por el IDE para la
clase será Class1; cambiaremos dicho nombre por Empleado, y pulsaremos Abrir.
PROF. MARIO ANTONIO HUAPALLA MORALES 4
5. Se creará de esta forma un nuevo fichero de código (EMPLEADO.VB), mostrándose el editor de código
con su contenido. Observemos en este sentido, que la definición de una clase se realiza utilizando las
palabras clave Class...End Class; entre estas palabras escribiremos el código de la clase.
Public Class Empleado
End Class
2.- Creación de un Objeto Por Referencia e Instancia.
Se referencia al objeto hacia una variable:
Dim Variable as [Objeto]
Creando el objeto o Instanciandolo:
Variable = New [Objeto]
1.2 Creación de un Objeto Por Referencia e Instancia a la vez.
Se referencia e instancia a la vez:
Dim Variable as New [Objeto]
Una vez creado el objeto se puede hacer uso de sus métodos y propiedades.
Ejemplo:
PROF. MARIO ANTONIO HUAPALLA MORALES 5
6. Acá se muestra que el objeto solo es referenciado por lo tanto se producirá una excepción que el
objeto no fue instanciado.
Si ahora instanciamos el objeto veremos que no produce ninguna excepción.
3.- Uso de Clases en .NET
Como vimos en los laboratorios anteriores, los tipos de datos se dividen en dos grupos: tipos por valor
y tipos por referencia. Los tipos por referencia realmente son clases, de la cuales debemos crear una
instancia para poder usarlas, cuando instanciamos una clase esta se crea en la parte lejana de la
memoria llamada heap, y las variables que la contienen solo hacen una referencia a la dirección de su
ubicación en la que la CLR ha almacenado el objeto recién creado.
En el .NET Framework la mayor parte a usar será una clase, la creación de formularios, la creación de
módulos, y las clases mismas etc., toda estas se grabaran con la extensión vb si usamos como lenguaje
predeterminado Visual Basic, para C# la extensión sera .cs.
PROF. MARIO ANTONIO HUAPALLA MORALES 6
7. 4.- Object: La clase base de todas las clases de .NET
Las clases existentes en la biblioteca de clases del .NET Framework, derivan de una clase principal
llamada object, es decir así lo indiquemos o no cualquier clase que definamos o usemos tendrá el
comportamiento
Todas las clases de .NET se derivan de la clase Object, es decir, lo indiquemos o no, cualquier clase que
definamos tendrá el comportamiento heredado de esa clase. El uso de la clase Object como base del
resto de las clases de .NET es la única excepción a la herencia simple soportada por .NET, ya que de
forma implícita, todas las clases de .NET se derivan de la clase Object independientemente de que
estén derivadas de cualquier otra.
De los miembros que tiene la clase Object debemos resaltar el método ToString, este método está
pensado para devolver una representación en formato cadena de un objeto.
5.- Definir una clase
En Visual Basic 2005, todo el código que queramos escribir, lo tendremos que hacer en un fichero con
la extensión .vb, dentro de ese fichero es donde escribiremos nuestro código, el cual, tal como dijimos
anteriormente siempre estará incluido dentro de una clase, aunque un fichero de código de VB puede
contener una o más clases, es decir, no está limitado a una clase por fichero.
En Visual Basic 2005 las clases se definen usando la palabra clave Class seguida del nombre de la clase,
esa definición acaba indicándolo con End Class.
6.- Los miembros de una clase
Una clase puede contener cualquiera de estos elementos (miembros):
• Enumeraciones
• Campos
• Métodos (funciones o procedimientos)
• Propiedades
• Eventos
Aquí una breve descripción:
Los campos
Son variables usadas para mantener los datos que la clase manipulará.
Los métodos
Son las acciones que la clase puede realizar, normalmente esas acciones serán sobre los datos que
contiene. Dependiendo de que el método devuelva o no un valor, podemos usar métodos de tipo
PROF. MARIO ANTONIO HUAPALLA MORALES 7
8. Function o de tipo Sub respectivamente.
Las propiedades
Son las "características" de las clases y la forma de acceder "públicamente" a los datos que contiene.
Por ejemplo, podemos considerar que el nombre y los apellidos de un cliente son dos características
del cliente.
Los eventos
Son mensajes que la clase puede enviar para informar que algo está ocurriendo en la clase.
Esquema de una Clase:
Public Class Empleados
Dim Codigo As Integer
Public bEstado As Boolean
Private sCta As String
Public Property Cuenta()
Get
Return sCta
End Get
Set(ByVal value)
sCta = value
End Set
End Property
Public Function BuscaEMpleado(ByVal _codigo As Integer) As String
Return "Felipe Castañeda"
End Function
End Class
Uso de la clase:
7.- Creación de Procedimientos Sobre Cargados
La sobrecarga de funciones (tanto para funciones como para procedimientos Sub), es una
característica que nos permite tener una misma función con diferentes tipos de parámetros, ya sea en
número o en tipo.
PROF. MARIO ANTONIO HUAPALLA MORALES 8
9. Supongamos que queremos tener dos funciones (o más) que nos permitan hacer operaciones con
diferentes tipos de datos, y que, según el tipo de datos usado, el valor que devuelva sea de ese mismo
tipo.
Ejemplo de procedimientos sobre cargados:
Sub VerificarDatos()
'Codigo a ejecutar
'.....
'.......................
End Sub
Sub VerificarDatos(ByVal xVar1 As String)
'Codigo a ejecutar
'.....
'.......................
End Sub
Function VerificarDatos(ByVal xVar1 As String, ByVal xVar2 As
Integer) As Boolean
'Codigo a ejecutar
'.....
'.......................
End Function
Sub VerificarDatos(ByVal ParamArray xVar1() As String)
'Codigo a ejecutar
'.....
'.......................
End Sub
Llamada a un Procedimiento Sobre Cargado:
Laboratorio 5
1.- Diseñe el siguiente formulario:
PROF. MARIO ANTONIO HUAPALLA MORALES 9
10. 2.- Programando:
Public Class Practica01
Structure alumno
Public nombre As String
Public nota As Integer
End Structure
Dim aIntegrantes() As alumno
Dim cContador As Integer
Private Sub Agregar(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdAgregar.Click
If Len(Trim(txtNombre.Text)) = 0 Or Len(Trim(txtNota.Text)) = 0 Then
MessageBox.Show("Faltan datos...", "Error")
Exit Sub
End If
cmdMostrar.Enabled = True
ReDim Preserve aIntegrantes(cContador)
aIntegrantes(cContador).nombre = txtNombre.Text
aIntegrantes(cContador).nota = txtNota.Text
cContador += 1
txtNombre.Focus()
End Sub
Private Sub Mostrar(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdMostrar.Click
Dim i As Integer
lsvDatos.Items.Clear()
For i = 0 To aIntegrantes.GetUpperBound(0)
Dim item As New ListViewItem(aIntegrantes(i).nombre)
item.SubItems.Add(aIntegrantes(i).nota)
lsvDatos.Items.Add(item)
Next
End Sub
Private Sub Modificar(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdModificar.Click
If lsvDatos.SelectedItems.Count <> 0 Then
lsvDatos.SelectedItems(0).SubItems(0).Text = txtNombre.Text
lsvDatos.SelectedItems(0).SubItems(1).Text = txtNota.Text
Dim i As Integer
i = lsvDatos.SelectedItems(0).Index
aIntegrantes(i).nombre = txtNombre.Text
aIntegrantes(i).nota = txtNota.Text
End If
End Sub
Private Sub SeleccionLista(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles lsvDatos.SelectedIndexChanged
If lsvDatos.SelectedIndices.Count = 0 Then Exit Sub
txtNombre.Text = lsvDatos.SelectedItems(0).SubItems(0).Text
txtNota.Text = lsvDatos.SelectedItems(0).SubItems(1).Text
End Sub
Private Sub Limpiar(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdLimpìar.Click
PROF. MARIO ANTONIO HUAPALLA MORALES 10
11. lsvDatos.Items.Clear()
cContador = 0
ReDim aIntegrantes(cContador)
txtNombre.Clear()
txtNota.Clear()
txtNombre.Focus()
cmdMostrar.Enabled = False
End Sub
End Class
Ejercicio:
1.- Diseñe y programe el siguiente formulario:
Conclusiones:
• Aprendimos el uso y creación de clases, objetos.
• Aprendimos las Principales característica de la programación orientada a objetos.
PROF. MARIO ANTONIO HUAPALLA MORALES 11