Tutorial POO

57
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: Herencia Encapsulación Polimorfismo

description

Programacion orientada a objetos

Transcript of Tutorial POO

Page 1: Tutorial POO

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:

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

Page 2: Tutorial POO

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

Page 3: Tutorial POO

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

Page 4: Tutorial POO

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

Page 5: Tutorial POO

 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;

Page 6: Tutorial POO

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

Page 7: Tutorial POO

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.

Page 8: Tutorial POO

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

Page 9: Tutorial POO

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:

Page 10: Tutorial POO

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

Page 11: Tutorial POO

  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:

Page 12: Tutorial POO

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

2. En el Explorador de soluciones, seleccionamos Persons.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

Persons.

4. Private firstNameValue As String

5. Private middleNameValue As String

6. Private lastNameValue As String

Public Married As Boolean

 

Page 13: Tutorial POO

7. Agregamos los siguientes procedimientos de propiedad debajo del código de

declaración anterior.

8. Public Property FirstName() As String

9.   Get

10.     FirstName = firstNameValue

11.   End Get

12.   Set(ByVal value As String)

13.     firstNameValue = value

14.   End Set

15. End Property

16.

17. Public Property MiddleName() As String

18.   Get

19.     MiddleName = middleNameValue

20.   End Get

21.   Set(ByVal value As String)

Page 14: Tutorial POO

22.     middleNameValue = value

23.   End Set

24. End Property

25.

26. Public Property LastName() As String

27.   Get

28.     LastName = lastNameValue

29.   End Get

30.   Set(ByVal value As String)

31.     lastNameValue = value

32.   End Set

End Property

 

Quedará así:

Page 15: Tutorial POO

33.En el menú Archivo, elegimos Guardar todo para guardar el trabajo.

Propiedades de sólo lectura y escritura

Page 16: Tutorial POO

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:

Page 17: Tutorial POO

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

 

Page 18: Tutorial POO

2. Introducimos los siguientes procedimientos de propiedad debajo del código de

declaración.

3. WriteOnly Property BirthYear() As Integer

4.   Set(ByVal value As Integer)

5.     birthYearValue = value

6.   End Set

7. End Property

8.

9. ReadOnly Property Age() As String

10.   Get

11.     Age = My.Computer.Clock.LocalTime.Year -

birthYearValue

12.   End Get

End Property

 

Page 19: Tutorial POO

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

Page 20: Tutorial POO

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.

Page 21: Tutorial POO

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

Page 22: Tutorial POO

 

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

Page 23: Tutorial POO

    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.

Page 24: Tutorial POO

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

 

Page 25: Tutorial POO

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.

Page 26: Tutorial POO

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.

Page 27: Tutorial POO

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.

Page 28: Tutorial POO

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.

Page 29: Tutorial POO

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.

Page 30: Tutorial POO

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

Page 31: Tutorial POO

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

 

Page 32: Tutorial POO

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.

Page 33: Tutorial POO

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

Page 34: Tutorial POO

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.

Page 35: Tutorial POO

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.

Page 36: Tutorial POO

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.

Page 37: Tutorial POO

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

Page 38: Tutorial POO

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

Page 39: Tutorial POO

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

Page 40: Tutorial POO

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.

Page 41: Tutorial POO

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

Page 42: Tutorial POO

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

Page 43: Tutorial POO

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.

Page 44: Tutorial POO

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

Page 45: Tutorial POO

  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

Page 46: Tutorial POO

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.

Page 47: Tutorial POO

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.

10. Dim player1 As New Persons.Players

Page 48: Tutorial POO

Dim player2 As New Persons.Players

Esto declara dos nuevas instancias de la clase Players.

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

Page 49: Tutorial POO

2. En el Editor de código, agregamos el siguiente código al procedimiento de evento

Form1_Load.

3. With player1

4.   .FirstName = "Wyrm"

5.   .LastName = "Garcia"

6.   .Number = 13

7.   .Position = "Shortstop"

8. End With

9. With player2

10.   .FirstName = "Joe"

11.   .LastName = "Black"

12.   .Number = 51

13.   .Position = "Catcher"

End With

Page 50: Tutorial POO

14.En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest y,

a continuación, en el menú Ver, hacemos clic en Diseñador.

15.En el Cuadro de herramientas, arrastramos dos controles Button al formulario.

Page 51: Tutorial POO

16.Seleccionamos el primer control Button y en la ventana Propiedades establecemos

su propiedad Text en At Bat.

17.Seleccionamos el segundo control Button y en la ventana Propiedades

establecemos su propiedad Text en On Deck.

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

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

20.En el controlador de eventos Button2_Click, agregamos el siguiente código.

21. MsgBox(player2.Position & " " & player2.FullName & ", #"

& _

 CStr(player2.Number) & " is on deck.")

Page 52: Tutorial POO

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

Page 53: Tutorial POO

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

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más

con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Page 54: Tutorial POO