1
programacion orientada a objetos en visual basic.net el Lun Nov 16, 2009 10:05 am
En éste tutorial vamos a ver la Programación Orientada a
Objetos(POO) de Visual Basic.NET, con la utilización y creación de
clases, de una forma mas o menos, sencilla. Recuerda descargar Visual Basic .NET y ver el tutorial básico de Visual Basic .NET antes de empezar.
Primero haré una explicacion sobre la POO , y veremos un poco lo básico. Luego empezaremos a usar lo aprendido poco a poco.
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 limitacion.
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.
Los tres pilares de la Programación Orientada a Objetos
Todos los lenguajes basados en objetos, deben cumplir estos tres requisitos:
Nota: Algunos autores añaden un cuarto requisito: la abstracción, pero este último está estrechamente ligado con la encapsulación.
Herencia
Esta es la característica más importante de la POO. Según la propia documentación de Visual Studio .NET:
"La
herencia permite crear nuevas clases a partir de clases existentes. La
herencia puede simplificar el diseño de la aplicación proporcionando
una estructura de relaciones entre las distintas clases. También admite
la reutilización de código porque sólo se debe codificar el
comportamiento de clases nuevas o distintas.".
Una
relación de herencia es una relación en la que un tipo (el tipo
derivado) se deriva de otro (el tipo base), de tal forma que el espacio
de declaración del tipo derivado contiene implícitamente todos los
miembros de tipo no constructor del tipo base.
"La herencia es la capacidad de una clase de obtener la interfaz y comportamiento de una clase existente."
Resumiendo: Gracias a la herencia podemos ampliar cualquier clase existente, además de aprovecharnos de todo lo que esa clase haga.
Encapsulación
Según Visual Studio.NET:
"La encapsulación es la
capacidad de contener y controlar el acceso a un grupo de elementos
asociados. Las clases proporcionan una de las formas más comunes de
encapsular elementos."
Cuando usamos las clases, éstas tienen una serie de características
(los datos que manipula) así como una serie de comportamientos (las
acciones a realizar con esos datos). La encapsulación es esa capacidad
de la clase de ocultarnos sus interioridades para que sólo veamos lo
que tenemos que ver, sin tener que preocuparnos de cómo está codificada
para que haga lo que hace... simplemente nos debe importar que lo hace.
Resumiendo: Establece la separación entre la interfaz del objeto y su implementación.
Polimorfismo
Según la documentación de Visual Studio.NET:
"El
polimorfismo se refiere a la posibilidad de definir múltiples clases
con funcionalidad diferente, pero con métodos o propiedades denominados
de forma idéntica, que pueden utilizarse de manera intercambiable
mediante código cliente en tiempo de ejecución."
Dicho de otra manera, puede tener múltiples clases que se pueden
utilizar de forma intercambiable, si bien cada clase implementa las
mismas propiedades o los mismos métodos de maneras diferentes. El
polimorfismo es importante en la programación orientada a objetos
puesto que permite usar elementos que tienen el mismo nombre,
independientemente del tipo de objeto que se esté utilizando en ese
momento.
Resumiendo: Determina que el mismo nombre de método realizará diferentes acciones según el objeto sobre el que se ha aplicado.
¿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.
Pensad 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.
Aunque puede que no os hayáis dado cuenta, ya hemos utilizado las clases en otros tutoriales de VB que hay por Cristalab, como por ejemplo,en el tutorial básico de Visual Basic .NET o al crear aplicaciones con .NET y las seguiremos viendo en los próximos Tips o Tutoriales que vengan.
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 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 AccountNumber o AccountBalance, métodos como
CalculateInterest y eventos como BalanceChanged. 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 BankAccount, por ejemplo:
'Declaramos la clase BlankAccount
Class BankAccount
'La hacemos privada
Private AccountNumber As String
Private AccountBalance As Decimal
'Y la ponemos publica para que calcule el balance
Public Sub UpdateBalance()
End Sub
ReadOnly Property Balance() As Decimal
Get
Return AccountBalance
End Get
End Property
End Class
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
Si habéis seguido los tutos de Visual Basic de Cristalab, o sabéis
de ello, sabréis que al hacer doble clic en un formulario y abrir el
Editor de código se veía algo parecido a lo siguiente:
Public Class Form1
Private Sub Form1_Load...
End Sub
End Class
Pues mirad, 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.
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:
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:
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:
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 Persons,
se puede tener una propiedad Boolean denominada Married, 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 Married 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:
Por ejemplo, un procedimiento de propiedad para una propiedad Name, de la clase Persons, podría ser como el que sigue:
Private nameValue As String
Public Property Name() As String
Get
Name = nameValue
End Get
Set(ByVal value As String)
nameValue = value
End Set
End Property
La
primera línea de código declara una variable String privada, nameValue
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 Persons.Name, el código
devolverá el valor almacenado en la variable nameValue.
El
procedimiento Set contiene código que se utiliza para asignar un nuevo
valor a la variable nameValue usando un valor pasado como argumento
value. Por ejemplo, si escribimos el código Persons.Name = "Wyrm", el
valor String Wyrm se pasará como argumento value; el código del
procedimiento Set lo asignará a la variable NameValue para su
almacenamiento.
¿Por qué complicarnos tanto, en lugar de
utilizar un campo que represente la propiedad Name? 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 value y devolver un error si contiene
números.
Siguiendo con la Clase Persons, ahora agregaremos un campo y tres propiedades:

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.
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:
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 Account puede tener un procedimiento Sub denominado
Recaculate, 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 Recalculate()
'Aqui el codigo para recalcular Account.
End Sub
Public Function CurrentBalance(ByVal AccountNumber As Integer) As Double
'Codigo para volver a Balance
End Function
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 Persons 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 CalcAge(ByVal year As Integer) As Integer
CalcAge = 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:
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.
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
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.
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
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:
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
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
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 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:
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:
Para probar la clase derivada:
Y aqui, finalizando probar una clase derivada, acabamos con el tutorial sobre la POO y sus clases en Visual Basic.NET.
Hemos visto, qué son y cómo crear clases, agregarle propiedades,
métodos y eventos, las hemos heredado, etc. Espero que no se os haya
hecho demasiado largo, ni muy tostonazo, pero la mejor forma de
aprender y de que las cosas se entiendan, es haciéndolo uno mismo...
Espero que las explicaciones hayan estado claras, y que a quien le
haya gustado este tema, no dude en profundizarlo un poco mas, yo solo
he levantado la primera capa de todo lo que hay debajo. Suerte!!
PD: El archivo del tutorial contiene todo lo que hemos ido haciendo
desde el principio del tutorial, para ver los tres ejemplos, debereis
hacer Clic en "Establecer como proyecto de inicio", como ya hicimos
durante el tuto.
chao...

Objetos(POO) de Visual Basic.NET, con la utilización y creación de
clases, de una forma mas o menos, sencilla. Recuerda descargar Visual Basic .NET y ver el tutorial básico de Visual Basic .NET antes de empezar.
Primero haré una explicacion sobre la POO , y veremos un poco lo básico. Luego empezaremos a usar lo aprendido poco a poco.
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 limitacion.
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.
Los tres pilares de la Programación Orientada a Objetos
Todos los lenguajes basados en objetos, deben cumplir estos tres requisitos:
- Herencia
- Encapsulación
- Polimorfismo
Nota: Algunos autores añaden un cuarto requisito: la abstracción, pero este último está estrechamente ligado con la encapsulación.
Herencia
Esta es la característica más importante de la POO. Según la propia documentación de Visual Studio .NET:
"La
herencia permite crear nuevas clases a partir de clases existentes. La
herencia puede simplificar el diseño de la aplicación proporcionando
una estructura de relaciones entre las distintas clases. También admite
la reutilización de código porque sólo se debe codificar el
comportamiento de clases nuevas o distintas.".
Una
relación de herencia es una relación en la que un tipo (el tipo
derivado) se deriva de otro (el tipo base), de tal forma que el espacio
de declaración del tipo derivado contiene implícitamente todos los
miembros de tipo no constructor del tipo base.
"La herencia es la capacidad de una clase de obtener la interfaz y comportamiento de una clase existente."
Resumiendo: Gracias a la herencia podemos ampliar cualquier clase existente, además de aprovecharnos de todo lo que esa clase haga.
Encapsulación
Según Visual Studio.NET:
"La encapsulación es la
capacidad de contener y controlar el acceso a un grupo de elementos
asociados. Las clases proporcionan una de las formas más comunes de
encapsular elementos."
Cuando usamos las clases, éstas tienen una serie de características
(los datos que manipula) así como una serie de comportamientos (las
acciones a realizar con esos datos). La encapsulación es esa capacidad
de la clase de ocultarnos sus interioridades para que sólo veamos lo
que tenemos que ver, sin tener que preocuparnos de cómo está codificada
para que haga lo que hace... simplemente nos debe importar que lo hace.
Resumiendo: Establece la separación entre la interfaz del objeto y su implementación.
Polimorfismo
Según la documentación de Visual Studio.NET:
"El
polimorfismo se refiere a la posibilidad de definir múltiples clases
con funcionalidad diferente, pero con métodos o propiedades denominados
de forma idéntica, que pueden utilizarse de manera intercambiable
mediante código cliente en tiempo de ejecución."
Dicho de otra manera, puede tener múltiples clases que se pueden
utilizar de forma intercambiable, si bien cada clase implementa las
mismas propiedades o los mismos métodos de maneras diferentes. El
polimorfismo es importante en la programación orientada a objetos
puesto que permite usar elementos que tienen el mismo nombre,
independientemente del tipo de objeto que se esté utilizando en ese
momento.
Resumiendo: Determina que el mismo nombre de método realizará diferentes acciones según el objeto sobre el que se ha aplicado.
¿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.
Pensad 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.
Aunque puede que no os hayáis dado cuenta, ya hemos utilizado las clases en otros tutoriales de VB que hay por Cristalab, como por ejemplo,en el tutorial básico de Visual Basic .NET o al crear aplicaciones con .NET y las seguiremos viendo en los próximos Tips o Tutoriales que vengan.
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 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 AccountNumber o AccountBalance, métodos como
CalculateInterest y eventos como BalanceChanged. 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 BankAccount, por ejemplo:
'Declaramos la clase BlankAccount
Class BankAccount
'La hacemos privada
Private AccountNumber As String
Private AccountBalance As Decimal
'Y la ponemos publica para que calcule el balance
Public Sub UpdateBalance()
End Sub
ReadOnly Property Balance() As Decimal
Get
Return AccountBalance
End Get
End Property
End Class
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
Si habéis seguido los tutos de Visual Basic de Cristalab, o sabéis
de ello, sabréis que al hacer doble clic en un formulario y abrir el
Editor de código se veía algo parecido a lo siguiente:
Public Class Form1
Private Sub Form1_Load...
End Sub
End Class
Pues mirad, 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.
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.

- 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:
- 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 Persons,
se puede tener una propiedad Boolean denominada Married, 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 Married 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.
Por ejemplo, un procedimiento de propiedad para una propiedad Name, de la clase Persons, podría ser como el que sigue:
Private nameValue As String
Public Property Name() As String
Get
Name = nameValue
End Get
Set(ByVal value As String)
nameValue = value
End Set
End Property
La
primera línea de código declara una variable String privada, nameValue
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 Persons.Name, el código
devolverá el valor almacenado en la variable nameValue.
El
procedimiento Set contiene código que se utiliza para asignar un nuevo
valor a la variable nameValue usando un valor pasado como argumento
value. Por ejemplo, si escribimos el código Persons.Name = "Wyrm", el
valor String Wyrm se pasará como argumento value; el código del
procedimiento Set lo asignará a la variable NameValue para su
almacenamiento.
¿Por qué complicarnos tanto, en lugar de
utilizar un campo que represente la propiedad Name? 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 value y devolver un error si contiene
números.
Siguiendo con la Clase Persons, ahora agregaremos un campo y tres propiedades:
- Abrimos
el proyecto Persons 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. - En el Explorador de soluciones, seleccionamos Persons.vb y en el menú Ver elegimos Código.

- Agregamos el siguiente código de declaración debajo de la línea Public Class Persons.
Private firstNameValue As String
Private middleNameValue As String
Private lastNameValue As String
Public Married As Boolean

- Agregamos los siguientes procedimientos de propiedad debajo del código de declaración anterior.
Public Property FirstName() As String
Get
FirstName = firstNameValue
End Get
Set(ByVal value As String)
firstNameValue = value
End Set
End Property
Public Property MiddleName() As String
Get
MiddleName = middleNameValue
End Get
Set(ByVal value As String)
middleNameValue = value
End Set
End Property
Public Property LastName() As String
Get
LastName = lastNameValue
End Get
Set(ByVal value As String)
lastNameValue = value
End Set
End Property
Quedará así:

- 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.
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:
- 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

- 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

- En el menú Archivo, elegimos Guardar todo para guardar el trabajo.
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 Account puede tener un procedimiento Sub denominado
Recaculate, 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 Recalculate()
'Aqui el codigo para recalcular Account.
End Sub
Public Function CurrentBalance(ByVal AccountNumber As Integer) As Double
'Codigo para volver a Balance
End Function
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 Persons 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 CalcAge(ByVal year As Integer) As Integer
CalcAge = 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 Persons(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 secciónes anteriores, agregar propiedades
a la clase, y completar los procedimientos. - En el Explorador de soluciones, seleccionamos Persons.vb y, en el menú Ver, hacemos clic en Código.
- Agregamos el siguiente código bajo los procedimientos de propiedad.
Public Function FullName() As String
If middleNameValue <> "" Then
FullName = firstNameValue & " " & middleNameValue & " " _
& lastNameValue
Else
FullName = firstNameValue & " " & lastNameValue
End If
End Function

Private Function CalcAge(ByVal year As Integer) As Integer
CalcAge = 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
Age = CalcAge(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.
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.
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.
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.

- 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.

- 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.

- 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.
- 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.FullName)
MsgBox(CStr(person1.Age) & " years old")
If person1.Married = True Then
MsgBox(person1.FirstName & " is married")
Else
MsgBox(person1.FirstName & " is single")
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.

- 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.
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.
- 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.
MsgBox(person1.FirstName & " " & person1.MiddleInitial(True) & _
" " & person1.LastName)

- 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.

- 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.

- En el menú Archivo, hacemos clic en Guardar todo.
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

- 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.

- En el menú Archivo, hacemos clic en Guardar todo.
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 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.

- 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)
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:
- En el menú Archivo, elegimos Agregar y, a continuación, hacemos clic en Nuevo proyecto.
- En el cuadro de diálogo Agregar nuevo proyecto, en el panel Plantillas, seleccionamos una Aplicación de Windows Forms.
- En el cuadro Nombre, escribimos PlayerTest y hacemos clic en Aceptar.

- Se agregará un nuevo proyecto de Windows Forms al Explorador de soluciones y aparecerá un nuevo formulario.

- En
el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en
el menú Proyecto, hacemos clic en Establecer como proyecto de inicio. - En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el menú Proyecto, haga clic en Agregar referencia.
- Se abrirá el cuadro de diálogo Agregar referencia.
- Hacemos clic en la ficha Proyectos, elegimos Persons y hacemos clic en Aceptar.

- 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. - En el menú Archivo, hacemos clic en Guardar todo.
Para probar la clase derivada:
- En el Explorador de soluciones, seleccionamos
Form1 en el proyecto PlayerTest y, a continuación, en el menú Ver,
hacemos clic en Código.
- 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

- En
el Explorador de soluciones, seleccionamos Form1 en el proyecto
PlayerTest y, a continuación, en el menú Ver, hacemos clic en
Diseñador.
- En el Cuadro de herramientas, arrastramos dos controles Button al formulario.
- Seleccionamos el primer control Button y en la ventana Propiedades establecemos su propiedad Text en At Bat.
- Seleccionamos el segundo control Button y en la ventana Propiedades establecemos su propiedad Text en On Deck.
- 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. - En el controlador de eventos Button2_Click, agregamos el siguiente código.
MsgBox(player2.Position & " " & player2.FullName & ", #" & _
CStr(player2.Number) & " is on deck.")

- Presionamos F5 para ejecutar el programa. Hacemos clic en cada botón para ver los resultados.
Clic al Boton1(At Bat):
Clic al Boton2(on Deck):
- En el menú Archivo, elegimos Guardar todo.
Y aqui, finalizando probar una clase derivada, acabamos con el tutorial sobre la POO y sus clases en Visual Basic.NET.
Hemos visto, qué son y cómo crear clases, agregarle propiedades,
métodos y eventos, las hemos heredado, etc. Espero que no se os haya
hecho demasiado largo, ni muy tostonazo, pero la mejor forma de
aprender y de que las cosas se entiendan, es haciéndolo uno mismo...
Espero que las explicaciones hayan estado claras, y que a quien le
haya gustado este tema, no dude en profundizarlo un poco mas, yo solo
he levantado la primera capa de todo lo que hay debajo. Suerte!!
PD: El archivo del tutorial contiene todo lo que hemos ido haciendo
desde el principio del tutorial, para ver los tres ejemplos, debereis
hacer Clic en "Establecer como proyecto de inicio", como ya hicimos
durante el tuto.
chao...

Índice


