You are on page 1of 35

Visual .

NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

UNIDAD 21. PROGRAMACION ORIENTADA A OBJETOS

1. Introducción

Para entender lo que es Visual Basic .NET es necesario entender lo que es el
concepto de .NET (Net Framework).

Se trata de un entorno de desarrollo multilenguaje diseñado por Microsoft para
simplificar la construcción, distribución y ejecución de aplicaciones para Internet.

Precisamente Visual Basic es uno de los lenguajes de programación de alto nivel
que pertenecen al paquete .NET (otros lenguajes son C#, C/C++. Etc).

Con Visual Basic .NET se pueden escribir tanto programas convencionales como
para Internet. Las aplicaciones podrán mostrar una interfaz gráfica al usuario, o
bien una interfaz de texto (denominada de consola).

Los componentes clave de la plataforma .NET son: CLR (Common Languaje
Runtime) y la biblioteca de clases.
El lenguaje CLR pretende reunir las ventajas de los lenguajes que pertenecen a .Net
en uno solo.
Esta herramienta de desarrollo compila el código fuente de cualquiera de los
lenguajes soportados por .NET en un código intermedio (MSIL).
Para ejecutarse se necesita un segundo paso, un compilador JIT (just in time) que
es el que genera el código máquina real que se ejecuta en la máquina cliente.
La compilación JIT la realiza el CLR a medida que el programa invoca métodos. El
código ejecutable obtenido se almacena en la memoria caché del ordenador, siendo
recompilado de nuevo sólo en el caso de producirse algún cambio en el código
fuente.

Programa Código
escrito en .NET Compilador Código
Compilador Escrito en
(código fuente) MSIL
JIT máquina

MSIL, es un lenguaje máquina que no es específico de ningún procesador, sino de la
máquina virtual de .NET.
Luego las ventajas de Visual Basic Net respecto a otros lenguajes de programación
es que es independiente de la plataforma (lo mismo con todos los lenguajes
incluidos en .NET), es decir, que el código producido por el compilador Visual Basic
puede transportarse a cualquier plataforma (Intel, Motorota..) que tenga instalada
una máquina virtual .NET y ejecutarse. Pensando en Internet es muy importante ya
que esta red conecta ordenadores muy distintos.

2. Realización de un programa en Visual Basic .NET

Los pasos a seguir por un usuario de Visual Basic .NET son:

• Editar el programa
• Compilarlo
• Ejecutarlo
• Depurarlo

2VBNET 1
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Para poder escribir programas se necesita un entorno de desarrollo Visual Basic
.NET. Microsoft, propietario de Visual Basic, proporciona uno de forma gratuito,
.NET Framework SDK, que se puede obtener en la dirección:

www.microsoft.com/downloads

Solo falta un editor de código fuente. Es suficiente con un editor de texto sin
formato; por ejemplo el bloc de notas de windows.

Vamos a ver un ejemplo sencillo, donde muestra en pantalla el mensaje “Buenos
días”.

Usando el bloc de notas escribimos el siguiente código y guardamos con el nombre
primerprog.vb

Imports System
Public Module test
Public Sub Main()
Console.writeline("Buenos dias")
End Sub
End Module

Algunos detalles del código:

Imports System

Esta línea permite tener directamente accesibles los elementos del Namespace
System. Sin ella, se tendrían que utilizar los nombres completos para todos los
elementos contenidos dentro del Namespace. En nuestro caso, deberíamos utilizar:

System.Console.writeline(“Buenos días”)

Public Module test .. End Module

En Visual Basic, toda parte de código debe estar contenida dentro de un módulo o
clase.

Public Sub Main().. End Sub

Todas las instrucciones que no sean declaraciones deben colocarse dentro de un
procedimiento o una función. La mayor parte del código se coloca por lo tanto entre
las instrucciones Sub y End Sub o Function y End Function. En todos estos
procedimientos y funciones se define uno como punto de partida, de forma que al
ejecutarse ese procedimiento se ejecuta la aplicación. Este procedimiento debe ser
público y denominarse Main.

Console.writeline(“Buenos días”)

La clase console definida dentro del Namespace System proporciona un conjunto
de métodos, que permiten mostrar información en la consola o leer información de
ella. El procedimiento writeline permite mostrar una cadena de caracteres en la
consola.

Hay que destacar que Visual Basic no hace distinción entre minúsculas y
mayúsculas dentro de las instrucciones.

2VBNET 2
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Compilación

El framework .NET incluye un compilador en línea de comando para Visual Basic.
Para compilar el código fuente del programa anterior debemos abrir una ventana
de comandos para poder lanzar el compilador.

Inicio/Programas/Microsoft .NET framework SDK v2.0 /Símbolo del sistema del SDK

Una vez la ventana abierta, conviene colocarse en el directorio en el que se
encuentra el archivo fuente.
La compilación se lanza con el comando vbc primerprog.vb

Tras un instante, el compilador nos devuelve a la pantalla principal. Veremos que
nos ha creado un ejecutable .exe

Una vez creado el ejecutable ejecutamos el programa y vemos por pantalla el
mensaje Buenos días.

2VBNET 3
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Para aplicaciones mas complicadas suele ser útil especificar ciertas opciones para el
funcionamiento del compilador. El conjunto de las opciones disponibles se puede
obtener lanzando el comando vbc / ?.

Sin embargo, todo este trabajo de edición, compilación, ejecución y depuración, se
hará mucho más fácil si se utiliza un entorno de desarrollo con interfaz gráfica de
usuario que integre todas las herramientas anteriores, en lugar de utilizar la
interfaz de línea de ordenes del SDK.

El entorno de desarrollo integrado que más destaca es Microsoft Visual Studio .NET,
para aplicaciones empresariales ya que incorpora utilidades que facilitan mucho los
desarrollos más complejos.
El entorno Visual Basic 2005 Express (gratuito), permite escribir aplicaciones de
consola y aplicaciones con interfaz gráfica.

Nosotros utilizaremos Microsoft Visual Studio 2005 .NET.
Antes de empezar con la programación orientada a objetos vamos a ver qué una
pequeña introducción.
El contenedor de alto nivel es la solución en la que se puede colocar más de un
proyecto. Estos proyectos, a su vez, contendrán todos los elementos para que el
compilador sea capaz de generar un archivo ejecutable.

Al crear un nuevo proyecto se abrirá la siguiente ventana donde podremos indicar:

- el lenguaje utilizado para el desarrollo del proyecto,
- el tipo de proyecto a crear
- el nombre del proyecto
- la carpeta donde se almacenarán los archivos del proyecto.

Nota: si no aparece al comienzo donde guardar el proyecto se lo indicaremos
luego a través de la opción archivo/guardar todo

Después de aceptar, en el explorador de soluciones se presenta la nueva
solución con la que se puede trabajar.

2VBNET 4
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Una solución contiene por lo menos los siguientes archivos:

- Un archivo con extensión .sln es el archivo de configuración de la solución, y
contiene entres otras cosas la lista de todos los proyectos que componen la
solución.
- Un archivo con extensión .suo que registra las opciones asociadas a la
solución.
- Un archivo para el proyecto, .vbproj. Este archivo contiene todas las
informaciones de configuración del proyecto, junto con la lista de archivos
que constituyen el proyecto, lista de referencias usadas.
- Numerosos archivos con extensión .vb que contendrán el código fuente de
todas las clases, páginas y módulos que constituyen el proyecto.
- Un archivo .resx asociado a cada página de su aplicación. Su formato es
XML.
- Otros archivos en función de los elementos utilizados en el proyecto (bases
de datos, archivos html…)

Dentro de las plantillas disponibles en Visual Studio tenemos:

Aplicación Windows

Esta plantilla de proyecto es la más utilizada. Permite el desarrollo de aplicaciones
Windows estándar.
La plantilla añade al proyecto los siguientes elementos:

- Un archivo AssemblyInfo.vb utilizado para la descripción de la aplicación,
con los datos relativos a la versión.
- Un formulario de base con su archivo fuente form1.vb.

Las siguientes referencias se añaden automáticamente y se importan:

-System
-System.Data
-System.Drawing
-System.Windows.Forms
-System.Xml

Biblioteca de clases

Esta plantilla se puede utilizar para crear clases y componentes que podrán
compartirse con otros proyectos.
La plantilla añade al proyecto los siguientes elementos:

- Un archivo AssemblyInfo.vb utilizado para la descripción de la aplicación,
con los datos relativos a la versión.
- Una clase de base con su archivo fuente class1.vb.

Las siguientes referencias se añaden automáticamente y se importan:

-System
-System.Data
-System.Xml

Biblioteca de controles Windows

2VBNET 5
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Permite crear una biblioteca de clases utilizable en otros proyectos. Esta biblioteca
es más específica, ya que se dedica a crear controles utilizables en una aplicación
Windows.
La plantilla añade al proyecto los siguientes elementos:

- Un archivo AssemblyInfo.vb utilizado para la descripción de la aplicación,
con los datos relativos a la versión.
- Una clase UserControl1 que hereda de la clase
System.Windows.Forms.UserControl y que proporciona las funcionalidades
de base para un control Windows, con su archivo UserControl1.vb.

Las siguientes referencias se añaden automáticamente y se importan:

-System
-System.Data
-System.Drawing
-System.Windows.Forms
-System.Xml

Aplicación de consola

Este tipo de aplicación debe ser ejecutada a partir de la línea de comandos de una
ventana de comandos. No tiene interfaz gráfica, y las entradas y salidas se realizan
a partir de la línea de comando y hacia la consola.
La plantilla añade al proyecto los siguientes elementos:

- Un archivo AssemblyInfo.vb utilizado para la descripción de la aplicación,
con los datos relativos a la versión.
- Una clase de base con su archivo fuente class1.vb.

Las siguientes referencias se añaden automáticamente y se importan:

-System
-System.Data
-System.Xml

Servicios Windows

Está plantilla está pensada para la creación de aplicaciones que se ejecutan como
tareas del sistema.

Proyecto Vacío

Esta plantilla se debe utilizar cuando se quiere crear un tipo personalizado de
proyecto. Se crea solo el archivo del proyecto. No se añaden automáticamente
elementos y no se crean ni se importan referencias.

Vamos a crear unos ejemplos sencillos de programación utilizando el entorno de
desarrollo Visual Studio 2005.

Ejemplo 1: Saludar al mundo
Dentro del entorno seleccionaremos archivo/nuevo proyecto dentro del
lenguaje Visual Basic Aplicación de Consola, le llamamos holamundo.vb y
automáticamente se creará

2VBNET 6
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Dentro del Sub Main() .. End Sub introducimos el código.
Se puede indicar de diferentes formas:

Module HolaMundo
'
' Punto de entrada al programa.
'
Sub Main()
System.Console.WriteLine("Hola mundo!!!")
System.Console.Readline()
End Sub

End Module

Esto es posible si la clase
console de system esta
importada.

Al ejecutar visualizaremos lo siguiente:

2VBNET 7
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Ejemplo 2: Operaciones aritméticas. Aritmetica.vb

En este caso calculamos la suma, resta, producto, y la división de dos datos cuyo
valor son 20 y 10.

Volvemos a utilizar el método WriteLine para mostrar el resultado por pantalla ,
su formato en este caso es:

dentro de esa cadena podemos usar unos indicadores o marcadores en los que se
mostrarán los parámetros indicados en esos dos métodos de la clase Console.

“{0} + {1} = {2} “ indicadores o marcadores que serán sustituidos por el
contenido de las variables que se indiquen a continuación dato1, dato2, dato3.

Los indicadores siempre comienzan por cero.

También se puede mejorar el formato de la información indicándolo de la siguiente
forma en los marcadores:

{N [, M ][: Formato ]}

• N será el número del parámetro, empezando por cero.
• M será el ancho usado para mostrar el parámetro, el cual se rellenará
con espacios. Si M es negativo, se justificará a la izquierda, y si es
positivo, se justificará a la derecha.
• Formato será una cadena que indicará un formato extra a usar con ese
parámetro.

Veamos algunos ejemplos para aclarar todo esto:

Console.WriteLine("---------- ----------")
Console.WriteLine("{0,10} {1,-10} {2}", 10, 15, 23)
Console.WriteLine("---------- ----------")
Console.WriteLine("{0,10:#,###.00} {1,10}", 10.476, 15.355)

2VBNET 8
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

El resultado de este ejemplo sería este:

Estas especificaciones de formato son aplicable a números, pero también lo es a
cadenas de caracteres y fechas. Veamos algunos ejemplos más:

Console.WriteLine("Hoy es: {0:G}", DateTime.Now)
Console.WriteLine("Hoy es: {0:dd/MM/yy}", DateTime.Now)
Console.WriteLine("Hoy es: {0:ddd, dd/MMM/yyyy}", DateTime.Now)

El resultado de estas líneas será el siguiente (al menos usando la configuración
regional que tengo en mi equipo, y de las funciones no te preocupes ya las veremos
mas adelante...):

Dim s As String = "Esta es una cadena larga de más de 20 caracteres"
Dim s1 As String = "Cadena más corta"

Console.WriteLine("--------------------")
Console.WriteLine("{0,20}", s)
Console.WriteLine("{0,20}", s1)
Console.WriteLine("--------------------")

La salida de este código es la siguiente:

2VBNET 9
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Ejemplo 3: Procedimientos

Module Aritmética
'
' Procedimiento sumar:
' parámetros x e y de tipo double
' devuelve x + y
'
Function sumar(ByVal x As Double, ByVal y As Double) As Double
Dim resultado As Double = 0
sumar = x + y
'resultado = x + y
'Return resultado
End Function

Sub Main()
Dim a As Double, b As Double, r As Double = 0
Console.WriteLine("Introduzca un numero: ")
a = Console.ReadLine()
Console.WriteLine("Introduzca un numero: ")
b = Console.ReadLine()
r = sumar(a, b)
System.Console.WriteLine("Suma = " & r)

End Sub

End Module

Este método Readline() se usa para recoger la información que el usuario
introduce a través del teclado. Cuando invocamos al método Console.ReadLine() el
sistema queda en espera hasta que el usuario pulsa la tecla Intro.

Si se asigna la llamada a Console.ReadLine() a una variable se consigue capturar el
dato introducido por el usuario, para después poder operar con él.

2VBNET 10
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

3. Programación orientada a objetos

En un lenguaje clásico, el funcionamiento de una aplicación está organizado por una
sucesión de llamadas a los diferentes procedimientos y funciones disponibles en el
código.
La programación orientada a objetos (POO) es un modelo de programación que
utiliza objetos que dialogan entre sí (mensajes) para realizar las distintas
tareas programadas. La idea central es simple: organizar los programas a imagen
y semejanza de la organización de los objetos en el mundo real.

En un lenguaje orientado a objetos, se intenta agrupar al máximo los datos y el
código para manipularlos. Las clases son la representación simbólica de los
objetos. Describen los campos, las propiedades, los métodos y los eventos(tal y
como el plano de un arquitecto describe las diferentes partes de un edificio).

Siguiendo con la analogía entre una clase y un plano de un edificio. Sabemos que
es posible construir diferentes edificios a partir del mismo plano. De la misma
manera, se pueden construir muchos objetos a partir de la misma clase.

3.1 Objetos.Clases

La clase no es otra cosa que el conjunto de especificaciones o normas que definen
cómo va a ser creado un objeto de un tipo determinado; por un lado definimos los
datos que dicha clase puede manipular o contener y por otro la forma de acceder a
esos datos.

Objeto es una agrupación de código, compuesta de propiedades y métodos, que
pueden ser manipulados como una entidad independiente.

Digamos que la clase es la "plantilla" a partir de la cual podemos crear un objeto en
la memoria.

Los términos clase y objeto por lo tanto son diferentes. Una clase representa la
estructura de un elemento, mientras que el objeto es un ejemplar creado
basándose en el modelo de esta estructura. La modificación de un objeto no
cambia para los otros objetos creados a partir del mismo modelo (clase).En nuestro
ejemplo: añadir una parte a un edificio existente no cambia en los demás edificios
construidos siguiendo el mismo plano. Al revés, la modificación del plano(clase)
lleva una serie de modificaciones para todos los nuevos edificios (todos los nuevos
objetos).

Ejemplo 2: pensamos en un molde de hacer flanes; el molde es la clase y los flanes
los objetos. Esto es, si disponemos de un molde de un litro para hacer flanes de
vainilla (ingredientes: leche, vainailla, azucar etc..), el molde agrupa las
propiedades comunes a todos los flanes de vainilla, pero no todos los flanes tienen
que tener la misma cantidad de ingredientes.

Ejemplo 3:

2VBNET 11
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Las clases están constituidas por campos, propiedades, métodos y eventos.

Los campos y propiedades representan las informaciones contenidas en los objetos.
Los campos se consideran variables y es posible leer su contenido o asignarles
directamente un valor. Las propiedades se manipulan de la misma manera que
los campos, pero se crean con los procedimientos Get y Set. Esto permite un mayor
control en la manera en que se leen y se devuelve los valores.

Los métodos representan las acciones que un objeto puede realizar. Se aplican
creando procedimientos o funciones en una clase.

Los eventos son informaciones que un objeto recibe o transmite desde o hacia otro
objeto o aplicación. Estos permiten que los objetos ejecuten ciertas acciones al
verificarse una situación especial (p.e. evento que puede venir cuando el usuario
realiza una acción con el ratón o teclado)

3.2 Polimorfismo, encapsulación y herencia.

En la programación orientada a objetos hay tres características fundamentales que
le hacen diferentes al resto de tipo de programación: polimorfismo,
encapsulación y la herencia.

Herencia: La herencia es la capacidad de crear nuevas clases a partir de una clase
existente. La nueva clase hereda todas las propiedades, métodos y eventos de la
clase base y puede personalizarse agregando nuevas propiedades y métodos. La
herencia se usa habitualmente en el entorno .NET Framework. Cada vez que se
crea un objeto, se deriva de la clase base y se utiliza sus propiedades y métodos.

Encapsulación: 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). Pues 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.

Poliformismo: es la capacidad para utilizar indistintamente los métodos y
propiedades de múltiples clases con el mismo nombre, aunque cada una de ellas
implemente las propiedades y métodos de forma diferente. En VB .NET, esta
propiedad se conoce como polimorfismo basado en herencia. El objetivo del
polimorfismo es permitir la anulación de la funcionalidad de un método o propiedad
al heredar la clase.

Veamos con un ejemplo: consideramos una entidad bancaria. En ella identificamos
entidades que son cuentas: cuenta del cliente 1, cuenta del cliente 2,… Luego una
cuenta puede verse como un objeto que tiene unos atributos, nombre, número de
cuenta, y saldo, y un conjunto de métodos como IngresarDinero, RetirarDinero,
AbonarIntereses, SadoActual, Transferencia.

Ordenar una transferencia de una cuenta a otra podría indicarse de la siguiente
forma:

Cuenta01.Transferencia(cuenta02)

Donde transferencia sería el mensaje que el objeto cuenta02 envía al objeto
cuenta01, solicitando le sea una hecha una transferencia, siendo la respuesta a tal
mensaje la ejecución del método transferencia.

2VBNET 12
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Declaración de una clase

Cuando escribimos un POO lo que hacemos es diseñar un conjunto de clases, desde
las cuales se crearán los objetos necesarios cuando el programa se ejecute.
Este proceso por el cuál se obtiene un objeto a partir de las especificaciones de una
clase se conoce como instanciación de objetos
Cada una de estas clases incluye dos partes: los atributos y los métodos. Los
atributos definen el estado de cada uno de los objetos de esa clase y los métodos
su comportamiento.

Objeto

mensajes
atributos

métodos

Normalmente, los atributos, la estructura más interna del objeto, se ocultan a los
usuarios del objeto (encapsulación), manteniendo como única conexión con el
exterior los mensajes. Esto quiere decir que los atributos de un objeto solamente
podrán ser manipulados por los métodos del propio objeto. Este conjunto de
métodos reciben el nombre de interfaz: medio de comunicación con un objeto.

Vamos a crear la clase de objetos CCuenta que representa una cuenta bancaria.

Abrimos Visual Studio 2005, seleccionamos el lenguaje Visual Basic y aplicación de
consola.

Borramos todo y creamos la clase de la siguiente forma:

Public Class ccuenta

Private nombre As String ' nombre del cliente del banco al que pertenece
Private cuenta As String ' número de cuenta
Private saldo As Double ' saldo actual de la cuenta
Private tipoDeInteres As Double ' tipo de interes en tanto por cien

End Class

Entre Class y End Class indicamos los atributos asociados a la clase cuenta.

Una clase puede ser:

Public: se podrá utilizar en todo su proyecto, pero también en otros proyectos.
Friend: el acceso a la clase está limitado al proyecto en el que está definida.
Private: la clase sólo se puede utilizar en el módulo en el que está definida.
Protected:l a clase sólo se puede utilizar en una subclase de la clase en la que
está definida. Esta palabra sólo se puede utilizar en una clase definida dentro de
otra clase.
Protected Friend: la unión de los alcances de protected y friend.

2VBNET 13
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Antes se ha mencionado que los atributos de un objeto de una clase se ocultan a
los usuarios del mismo. Esto significa que un usuario que utilice la clase CCuenta en
su programa no podrá escribir su código basado directamente en estos atributos ,
sino que tendrá que acceder a ellos a través de los métodos que implemente la
clase. Esto se consigue con el modificador Private, suele utilizarse dos
modificadores private y public , si se utiliza dim se supone como private.

Si definimos un campo(variable) de forma Public desde el programa principal
main() podremos acceder a dicho campo sin ningún problema desde la instancia de
clase ccuenta.

Un miembro declarado private es accesible solamente por los métodos de su propia
clase, y por lo tanto no se puede acceder a él por los métodos de cualquier otra
clase, incluidas las subclases.

Afortunadamente no se tendrá que escribir todas las clases que se necesiten en un
programa, porque .NET proporciona una biblioteca de clases estándar para realizar
las operaciones más habituales.

• Clases de uso común

Vemos que todos nuestros programas van a estar estructurados en clases.
Dada la gran cantidad de clases se intenta buscar un modo coherente de
organizarlas y para ello se crean en todos los lenguajes .NET los espacios
de nombres o namespaces.

Un espacio de nombres no es más que un identificador que permite organizar las
clases que estén contenidas en él así como otros espacios de nombres.

Dentro de los diferentes espacios de nombres hay uno que destaca por las clases
de propósito general que incluye: System en este encontraremos la clase console
que proporciona los métodos para manipular la entrada/salida estándar, la clase
string para manipular los métodos correspondientes para manipular cadenas, la
clase Math que proporciona los métodos correspondientes a las funciones
matemáticas de uso más frecuente, …

System.Windows
Contiene el conjunto de elementos que permiten la creación de interfaces para
usuarios de Windows.

System.Web
Contiene todos los recursos necesarios para crear aplicaciones Web, como por
ejemplo las clases de la tecnología ASP.NET o las clases usadas para crear servicios
Web XML.

System.Data
Contiene un conjunto de clases especializadas en el acceso a la base de datos, con
el soporte ADO.NET

System.Xml
El lenguaje XML está ahora por todas partes y este Namespace contiene las clases
que permiten la manipulación de documentos XML.

La entrada y salida queda reforzada con la clase System.IO, que a su vez, aporta
clases para el manejo de ficheros.

2VBNET 14
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

En visual studio 2005 se pueden visualizar a través de ver/examinador de
objetos

Cuando se realiza un programa orientado a objetos, no se definen objetos
verdaderos, se definen clases de objetos, donde una clase se ve como una plantilla
para múltiples objetos con características similares.

Por ejemplo, en un proyecto de un edificio sabemos que es posible construir
diferentes edificios a partir del mismo plano

MENSAJES Y MÉTODOS: un programa orientado a objetos se compone solamente
de objetos. Cada uno de ellos es una entidad que tiene unas propiedades
particulares, los atributos, y unas formas de operar sobre ellos, los métodos. Por
ejemplo, una ventana de una aplicación de Windows es un objeto. El color de fondo,
la anchura, la altura, etc son atributos. Las rutinas (código), transparentes al
usuario, que permiten maximizar la ventana, minimizarla, etc. son los métodos.

Cuando se ejecuta un programa orientado a objetos, los objetos están recibiendo,
interpretando y respondiendo a mensajes de otros objetos. En la POO un mensaje
está asociado con un método, de tal forma que cuando un objeto recibe un mensaje
la respuesta a ese mensaje es ejecutar el método asociado. Por ejemplo, cuando un
usuario quiere maximizar una ventana de una aplicación Windows, lo que hace se
hace es simplemente pulsar el botón correspondiente lo que provoca que Windows
envíe un mensaje a la ventana para indicar que tiene que maximizarse. Como
respuesta a este mensaje se ejecutará el método programado para ello.

Un método se escribe en una clase de objetos y determina cómo tiene que actuar el
objeto cuando recibe el mensaje vinculado con ese método. A su vez, un método
puede también enviar mensajes a otros objetos solicitando una acción o
información. Además los atributos definidos en la clase permitirán almacenar
información para dicho objeto.

El comportamiento queda definido por las acciones que se pueden realizar con la
clase CCuenta. Por ejemplo, de una cuenta de un cliente se puede:

• Asignar el nombre de un cliente a una cuenta
• Obtener el nombre del cliente de una cuenta
• Asignar el número de cuenta
• Obtener el número de cuenta
• Realizar un ingreso
• Realizar un reintegro
• Asignar un tipo de interés
• Obtener un tipo de interés
• Obtener un saldo.
Para definir estas acciones hay que añadir métodos a la clase. Los métodos son
rutinas de código definidas dentro del cuerpo de la clase.

Vamos agregar a la clase CCuenta un método que responda a la acción asignar el
nombre de un cliente a una cuenta.

Public Sub AsignarNombre(nom As String)
If nom.Length = 0 Then
System.Console.WriteLine("error: cadena vacia")
Else
nombre = nom
End If

2VBNET 15
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

End Sub
Se ha declarado el método como público para que pueda ser accesible para
cualquier otra clase o subclase que necesite utilizarlo.

Un método consta de un nombre precedido por Function si devuelve un valor, o
bien Sub si no devuelve un valor. Además indicaremos los parámetros si fueran
necesarios (byval por valor y byref por referencia).
Por omision es byval.
El método AsignarNombre asegura que el nombre a asignar no sea una cadena
vacía (atributo length de la clase string )

Vamos a crear otro método: queremos obtener el estado de la cuenta, es decir , el
saldo.

Public Function estado() As Double
Return saldo
End Function

Realizar los métodos que faltan.

PROGRAMA MAIN

Para poder crear objetos de esta clase y trabajar con ellos, tendremos que escribir
un programa. En un programa tiene que haber un módulo con un procedimiento
Main, puesto que éste es el punto de entrada y salida del programa.

Esto se puede hacer de diferentes formas:

1. Añadir a la clase CCuenta un procedimiento Main declarado Shared que
incluya el código del programa (crear objetos CCuenta y realizar operaciones
con ellos)
2. Añadir en el mismo fichero fuente en el que esta almacenada la clase
CCuenta, otro módulo estandar Test, que incluya el procedimiento Main. En
un modulo estandar (module) todos sus miembros son Shared por omision.
3. Tenemos un fichero fuente CCuenta.vb, con la clase CCuenta. Añadir en la
misma carpeta otro fichero fuente, Test.vb, con un modulo estandar que
incluya el procedimiento Main.

Un objeto de una determinada clase se crea en el momento en que se invoca al
operador New para dicha clase.

Hay 3 formas posibles, de instanciar una clase existente:
Suponiendo que tenemos la clase CCuenta

Forma 1: declarar primero la variable y después instanciar el objeto

Dim cuenta01 As CCuenta
Cuenta01 = New CCuenta()

Forma 2: declaración e instanciación simultánea

Dim cuenta02 As New CCuenta()

2VBNET 16
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Forma 3: declaración y posterior instanciación en ' la misma línea de código

Dim cuenta03 As CCuenta = New CCuenta()

De esta forma podemos decir que cuenta01, cuenta02 y cuenta03 son objetos
(instancias) de la clase CCuenta.

Vamos a utilizar la segunda forma. En Visual Studio 2005 proyecto/agregar modulo

Module Test
Public Sub Main()
' declaramos los objetos de la clase cuenta
Dim cuenta01 As CCuenta = New CCuenta()

cuenta01.asignarNombre("Un nombre")
cuenta01.asignarCuenta("Una cuenta")
cuenta01.asignarTipoDeInteres(2.5)

cuenta01.ingreso(1000000)
cuenta01.reintegro(500000)

System.Console.WriteLine(cuenta01.obtenerNombre())
System.Console.WriteLine(cuenta01.obtenerCuenta())
System.Console.WriteLine(cuenta01.estado())
System.Console.WriteLine(cuenta01.obtenerTipoDeInteres())
System.Console.WriteLine()
System.Console.Readline()

End Sub

CONSTRUCTORES/DESTRUCTORES

Un constructor es un método especial de una clase que es llamado
automáticamente siempre que se crea una instancia de esa clase. Su función es
crear un objeto.

Un constructor se distingue fácilmente porque tiene el nombre New y no puede
retornar un valor (procedimiento Sub).
Por ejemplo, si añadimos un constructor a la clase CCuenta, se escribiría un método
Sub New(). Si en una clase no se escribe un constructor explícitamente , Visual
Basic asume uno por omisión. Por ejemplo, la clase CCuenta que hemos escrito
tiene por omisión el siguiente constructor definido:

Public Sub New()

End Sub

Como vemos es un constructor sin parámetros que no hace nada. Sin embargo, es
necesario porque será invocado cada vez que se construya un objeto sin especificar
ningún argumento, donde los valores predeterminados serán los indicados por el
sistema (numéricos ceros , alfanuméricos y referencias a objetos a nothing).

Para comprobar que un constructor es un método especial de una clase y que es
llamado automáticamente cada vez que se crea una instancia de una clase , vamos
a añadir lo siguiente en el método.

2VBNET 17
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Public Sub New()

Console.WriteLine(“Instancia CCuenta creado”)

End Sub

Se puede crear un constructor con el fin de poder dar unos valores
predeterminados al crear una instancia de la clase CCuenta.
Para ello crearemos el siguiente constructor:

Public Sub New(ByVal nom As String, ByVal cue As String, _
ByVal sal As Double, ByVal tipo As Double)
asignarNombre(nom)
asignarCuenta(cue)
ingreso(sal)
asignarTipoDeInters(tipo)
End Sub

Siempre que en una clase se define explícitamente un constructor , el constructor
implícito (constructor por omisión) es reemplezado por éste. Por ello es necesario
definirlo para que no de error.

Los constructores deben declararse siempre públicos para que sean invocados
desde cualquier parte.

Si creamos dos instancias de esta forma en el main()

Dim cuenta01 As CCuenta = New CCuenta()

En este caso invocará al constructor New()

Dim cuenta02 As CCuenta = New CCuenta("Un nombre dos",_
"Una cuenta dos", 1000000, 3.5)

En este caso se invocará al constructor con parámetros que hemos definido.
Y para comprobar que ha inicializado bien introduciremos en el programa lo
siquiente:

Console.WriteLine(cuenta02.obtenerNombre())
Console.WriteLine(cuenta02.obtenerCuenta())
Console.WriteLine(cuenta02.estado())
Console.WriteLine(cuenta02.obtenerTipoDeInters())

Vemos que se ha definido en un clase dos métodos con el mismo nombre New,
cuando esto ocurre se define que el método está sobrecargado, esto es posible
si los dos métodos tienen un número parámetros distintos o con el mismo número
pero diferenciándose en al menos un párametro sea de tipo diferente.

Cuando una clase sobrecarga un método una o más veces , Visual Basic se fijará en
el número y tipos de argumentos en la llamada para saber cual de los métodos
tiene que ejecutar , por ello las instancias en el main() no da ningun error.

2VBNET 18
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Un destructor es otro método especial de una clase. Este se ejecutará cuando el
objeto creado en la memoria ya no sea necesario, es decir, cuando acabe la vida del
objeto creado.

El destructor de Visual Basic 2005 es un método llamado Finalize, el cual se hereda
de la clase Object, por tanto no es necesario que escribamos nada en él. Al igual
que el constructor se llama implícitamente y debe ser protected y overrrides sin
parámetros.

Luego no puede haber más de un destructor por clase, su declaración sería:

Protected Overrides Sub Finalize()

End Sub

La forma en que se destruyen los objetos pueden ser de dos formas: Porque los
destruyamos nosotros asignando un valor Nothing a la variable que lo referencia, o
bien porque el objeto esté fuera de ámbito, es decir, haya salido de su espacio de
ejecución, por ejemplo, si declaramos un objeto dentro de un método, cuando ese
método termina, el objeto se destruye, (hay algunas excepciones a esta última
regla, como puede ser que ese mismo objeto también esté referenciado por otra
variable externa al método.)

Si nuestra clase utiliza recursos externos, por ejemplo un fichero o una base de
datos, debemos definir un método que se encargue de liberarlos y a ese método
debemos encargarnos de llamarlo cuando ya no lo necesitemos. Por definición a
este tipo de métodos se les suele dar el nombre Close o Dispose, aunque este
último hay que tener cuidado.

Vamos a realizar otro ejemplo pero en este caso creando una aplicación windows.

Para ello vamos a crear un formulario de forma que al pulsar un botón me muestre
la información de la clase reloj que vamos a crear.

El código será el siguiente:
1. Deberá establecida la clase form1
2. A continuación las diferentes clases que se quieren definir

2VBNET 19
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

HERENCIA

La herencia es una características más importantes de POO porque permite que una
clase herede los atributos y métodos de otra clase (los constructores no se
heredan).
Esta carácterística garantiza la reutilización del código.
Con la herencia todas las clases están clasificadas en una jerarquía estricta. Cada
clase tiene una superclase (la clase superior en la jerarquía, también llamada clase
base), y cada clase puede tener una o más subclases( clases inferiores en la
jerarquía; también llamadas clases derivadas).

Clase CCuenta

Clase CCuentaCorriente Clase CCuentaAhorro

2VBNET 20
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Las clases que están en la parte inferior en la jerarquía se dice que heredan de la
clase superior.

El término heredar significa que las subclases disponen de todos los métodos y
propiedades de su superclase. Este mecanismo proporciona una forma rápida y
cómoda de extender la funcionalidad de una clase. En Visual Basic cada clase sólo
puede tener una superclase(o clase base), lo que se denomina herencia simple.

La clase Object es la clase raiz de la jerarquía de clases de la biblioteca .NET;
pertenece al paquete System. Por lo tanto, cualquier clase que implementemos en
nuestras aplicaciones pasará a ser automáticamente una subclase de esta clase.

Como ejemplo añadimos al programa anterior una nueva clase denominada
CCuentaAhorro que sea subclase de CCuenta.

Class CCuentaAhorro

Inherits CCuenta

End Class

Con la palabra Inherits indicamos que la clase CCuentaAhorro se deriva de
CCuenta.

Ahora si modificamos el modulo test de nuestro ejemplo y ponemos

Dim cuenta01 As CCuentaAhorro = New CCuentaAhorro( _
"Un nombre", "Una cuenta", 1000000, 3.5, 300)

' Cobrar cuota de mantenimiento
cuenta01.reintegro(cuenta01.obtenerCuotaManten())
' Ingreso
cuenta01.ingreso(1000000)
' Reintegro
cuenta01.reintegro(1800000)
' ...

System.Console.WriteLine(cuenta01.obtenerNombre())
System.Console.WriteLine(cuenta01.obtenerCuenta())
System.Console.WriteLine(cuenta01.estado())
System.Console.WriteLine(cuenta01.obtenerTipoDeInterés())

El resultado será:

Vemos que crea un objeto cuenta1 de la clase CCuentaAhorro y después , utilizando
los métodos de la superclase, inicia los atributos del objeto y muestra el resultado.

2VBNET 21
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Esto es posible ya que ha heredado todos los atributos y métodos de la clase
CCuenta excepto los constructores.

Luego si queremos construir objetos CCuentaAhorro iniciados con unos
determinados valores, tendremos que añadir a esta clase un constructor con los
parámetros necesarios. Además si queremos añadir funcionalidad a la clase
podemos añadir nuevos atributos y métodos.

En el ejemplo vamos a añadir un constructor sin argumentos y otro con ellos, un
nuevo atributo cuotaMantenimiento y los métodos asignarCuentaManten y
obtenerCuotaManten:

' Atributo
Private cuotaMantenimiento As Double

' Métodos
Public Sub New() ' constructor sin parámetros
End Sub

Public Sub New(nom As String, cue As String, _
sal As Double, tipo As Double, mant As Double)
MyBase.New(nom, cue, sal, tipo) ' invoca al constructor de
' CCuenta; esto es, al de la clase base.
asignarCuotaManten(mant) ' inicia cuotaMantenimiento
End Sub

Public Sub asignarCuotaManten(cantidad As Double)
If cantidad < 0 Then
System.Console.WriteLine("Error: cantidad negativa")
Else
cuotaMantenimiento = cantidad
End If
End Sub

Public Function obtenerCuotaManten() As Double
Return cuotaMantenimiento
End Function

En el caso de la clase reloj podemos definir una nueva clase relojanalogico y
podemos heredar las propiedades y métodos de la clase reloj, para que crear de
nuevo todo!!!!! , y además añadir nuevas propiedades y métodos.

Vamos a ver como:

Definimos al final del código (recuerda que la primera clase debe se la del
formulario) la definción de la nueva clase.

2VBNET 22
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Añadimos un nuevo botón al formulario

Redefinir un método

Una subclase puede redefinir cualquier método heredado de su clase padre,
siempre que sea necesario que su comportamiento en la subclase sea diferente.
Redefinir un método heredado significa volverlo a escribir en la subclase
con el mismo nombre, la misma lista de parámetros y el mismo tipo del
valor retornado que tenía en la superclase; su cuerpo será adaptado a las
necesidades de la subclase. Por ejemplo, supongamos que queremos obligar a
disponer de un saldo positivo superior 1.500 para las cuentas de ahorro con un
interés igual o mayor a 3,5; esto supone redefinir el método reintegro de la
siguiente forma:

En este caso cuando se haga referencia desde la subclase al método redefinido será
por defecto el definido en la subclase.

2VBNET 23
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Se puede utilizar de forma opcional palabra Overrides a la hora de hacer la
sustitución en la subclase. Y en la clase base utilizar la palabra Overridable dando
autorización a la sustitución.

Public Sub reintegro(cantidad as Double)
Dim saldo As Double = estado()
Dim tipoDeInterés As Double = obtenerTipoDeInterés()

If tipoDeInterés >= 3.5 Then
If saldo - cantidad < 1500 Then
System.Console.WriteLine("Error: no dispone de esa cantidad")
Return
End If
End If
MyBase.reintegro(cantidad) ' método reintegro de la clase base,
' también llamada superclase
End Sub

Una vez escrita la clase CCuentaAhorro, vamos a ver como será la estructura de un
objeto de esta clase comparada con la clase CCuenta.

La clase CCuenta está soportada por los miembros:

Atributos Métodos

Nombre Constructores de CCuenta
Cuenta asignarNombre
Saldo obtenerNombre
TipoDeInteres asignarCuenta
obtenerCuenta
Estado
Ingreso
Reintegro
asignarTipoDeInteres
obtenerTipoDeInteres

La clase CCuentaAhorro esta soportado por los miembros heredados de CCuenta
(en cursiva) y los suyos:

Atributos Métodos

Nombre Constructores de CCuenta
Cuenta asignarNombre
Saldo obtenerNombre
TipoDeInteres asignarCuenta
obtenerCuenta
Estado
Ingreso
Reintegro
asignarTipoDeInteres
obtenerTipoDeInteres
cuotaMantenimiento Constructores CCuentaAhorro
asignarCuotaManten
obtenerCuotaManten

2VBNET 24
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Reintegro

Vemos que los constructores de la clase CCuenta no se heredan , puesto que cada
clase define el suyo por omisión, y que el método reintegro queda oculto por el
método del mismo nombre de la clase CCuentaAhorro. Se puede acceder al
miembro oculto con la siguiente sintaxis: MyBase.miembro_oculto.

Según los cuadros anteriores, mientras un posible objeto CCuenta contendría los
datos, nombre, cuenta , saldo y tipoDeInteres, un objeto CCuentaAhorro contiene
datos, nombre, cuenta , saldo ,tipoDeInteres y cuotaMantenimiento.
¿Cómo se crea un objeto de subclase CCuentaAhorro?. Si observamos el
constructor CCuentaAhorro con parámetros vemos que tiene cinco: los cuatro
pimeros proveen valores para los atributos heredados de CCuenta, y el quinto para
el nuevo atributo .
Para iniciar los atributos heredados de la clase base lo más sencillo es invocar al
constructor de la misma; esto se hace mediante la llamada MyBase.New seguida
de los argumentos correspondientes; esta llamada tiene que ser la primera
sentencia en el constructor de la subclase, como vemos en el ejemplo:

Public Sub New(nom As String, cue As String, _
sal As Double, tipo As Double, mant As Double)
MyBase.New(nom, cue, sal, tipo) ' invoca al constructor de
' CCuenta; esto es, al de la clase base.
asignarCuotaManten(mant) ' inicia cuotaMantenimiento
End Sub

Otra posible solución hubiera sido:

Public Sub New(nom As String, cue As String, _
sal As Double, tipo As Double, mant As Double)

asignarNombre(nom)
asignarCuenta(cue)
ingreso(sal)
asignarTipoDeInterés(tipo)
asignarCuotaManten(mant)

End Sub

En modo de resumen, los siguientes puntos exponen las reglas a tener en cuenta
cuando se define una subclase:

1. Una subclase hereda todos los miembros de su superclase, excepto los
constructores, lo que no significa que tenga acceso directo a todos los
miembros. Una consecuencia inmediata de esto es que la estructura interna
de datos de un objeto de una subclase estará formada por los atributos que
ella define y por los heredados de su superclase.

Una subclase no tiene acceso directo a los miembros privados (Private) de
su superclase.

Una subclase si puede acceder directamente a los miembros públicos
(Public) de su superclase.

2VBNET 25
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

2. Una subclase puede añadir sus propios atributos y métodos. Si el nombre de
alguno de estos miembros coincide con el de un miembro heredado, este
último queda oculto para la subclase, que se traduce en que la subclase ya
no puede acceder directamente a ese miembro.

3. Los miembros heredados por una subclase pueden, a su vez, ser heredados
por más subclases de ella. A esto se llama propagación de herencia.

Siguiendo el ejemplo reloj, si queremos cambiar algo del método establecerhora
para el relojanalogico , tan solo tendremos que generar otro método con el mismo
nombre:

Class relojanalogico
Inherits reloj
' declaramos un nueva variable
Private cuerdaalreloj As Boolean = False
' declaramos un nuevo método

Function darcuerdaalreloj() As Boolean

darcuerdaalreloj = True

End Function

Sub establecerhora(ByVal seg As Integer, ByVal min As Integer, ByVal
hor As Integer)
If hor > 12 Then
hora = hor - 12
End If
segundo = seg
minuto = min
hora = hor
End Sub

End Class

Ahora obrelojanalogico.establecerhora utilizará el método modificado, es decir, el
definido dentro de su clase.

Sobrecarga de un método

La sobrecarga consiste en crear más de un método en una misma clase con el
mismo nombre y distintos tipos de argumento.

La sobrecarga es especialmente útil cuando un modelo de objeto exige el uso de
nombres idénticos para procedimientos que operan en diferentes tipos de datos.

Cada método sobrecargado debe tener distintas listas de parámetros. No se puede
cambiar las siguientes carácteristicas para sobrecargar un método:

• Modificadores, como por ejemplo ByVal o ByRef, que se aplican a un
miembro o parámetros de un miembro.
• Nombres de parámetros
• Tipos de valores devueltos de procedimientos

2VBNET 26
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

La palabra clave Overloads es opcional en la sobrecarga, aunque si algún miembro
sobrecargado la utiliza, todos los demás miembros sobrecargados con el mismo
nombre deben especificarla también.

Poniendo Overloads simplemente permite indicar al usuario que existen varios
métodos con el mismo nombre.

Veamos un ejemplo con la clase Reloj.

Tenemos un método definido establecerhora, vamos a definir otro con el mismo
nombre pero con dos parámetros

Overloads Sub establecerhora(ByVal seg As Integer, ByVal min As
Integer, ByVal hor As Integer)
segundo = seg
minuto = min
hora = hor
End Sub
Overloads Sub establecerhora(ByVal seg As Integer, ByVal min As
Integer)
segundo = seg * 60
minuto = min * 60
End Sub

La palabra overloads no es necesaria.

Ahora cuando se vaya a hacer referencia al método establecerhora veremos que
cuando vayamos a poner los parámetros se nos indicará los distintas formas de

Vemos que nos indica que hay dos métodos con el mismo nombre el primero con
los tres parámetros y el segundo (si lo seleccionamos) con dos parámetros.

También se podía haber definido con el mismo número de parámetros pero de
diferente tipo.

Overloads Sub establecerhora(ByVal seg As Double, ByVal min As Double,
ByVal hor As Integer)
segundo = Int(seg)
minuto = Int(min)
hora = hor

End Sub

Desde la llamada aparecería el tercer método sobrecargado

obreloj.establecerhora(12.3, 5.6, 8) llamada con decimales

2VBNET 27
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

EJERCICIO1 RESUELTO

En el siguiente ejercicio vamos a crear un clase COrdenador para simular el
trabajo con ordenadores.

La clase COrdenador puede incluir los siguientes atributos:

- Marca: Mitac, Toshiba, HP.
- Procesador: Intel, AMD.
- Peso: 2, 2.5,3.

Además podemos inluir como atributos el estado del ordenador

- ¿encendido?
- ¿pantalla activa?

Creamos un proyecto nuevo con el nombre Ordenador y añadimos la clase
COrdenador (proyecto/agregar clase) y definimos los atributos definidos arriba.

Public Class COrdenador
Private m_marca As String
Private procesador As String
Private peso As Integer = 0
Private encendido As Boolean = False
Private pantalla As Boolean = False

End Class

Hemos inicializado algunos atributos.

A continuación hay que pensar las acciones que se pueden realizar sobre un objeto
de la clase COrdenador, por ejemplo:

- encender el ordenador
- apagar el ordenador
- desactivar la presentación en pantalla
- activar la presentación en pantalla
- ver la información

Para definir estas acciones debemos realizar los métodos correspondientes. Vamos
a empezar con la primera acción: encender el ordenador

Public Sub EncenderOrdenador()
If encendido = True Then
Console.WriteLine("El ordenador ya esta encendido")
Else
encendido = True
pantalla = True
Console.WriteLine("El ordenador ha sido encendido")
End If

2VBNET 28
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

End Sub

Este método comprueba si el ordenador esta encendido; si lo está, visualizará un
mensaje que lo indica; si no lo está, lo enciende y lo comunica mediante un
mensaje.

Vamos a crear un nuevo método ver el estado del ordenador y sus propiedades.

Public Sub Estado()
Console.WriteLine("El estado del ordenador es el siguiente: ")
Console.WriteLine("Marca: " & m_marca)
Console.WriteLine("Procesador: " & procesador)
Console.WriteLine("Peso " & peso & " Kg ")
If encendido = True Then
Console.WriteLine("El ordenador esta encendido")
Else
Console.WriteLine("El ordenador esta apagado")
End If
If pantalla = True Then
Console.WriteLine("La pantalla esta encendida")
Else
Console.WriteLine("La pantalla esta apagada")
End If
Console.WriteLine()
Console.ReadLine()
End Sub

En principio no vamos a crear más metodos.
El siguiente paso es crear un objeto de la clase COrdenador (instancia) para poder
trabajar con dicha clase. Para ello necesitamos un modulo que tenga un
procedimiento Main() para poder definir la clase y poder utilizarla.
Añadimos un modulo (proyecto/agregar modulo) y le damos el nombre
MOrdenador.vb.

Module MOrdenador
Public Sub Main()
Dim miordenador As COrdenador = New COrdenador()

End Sub
End Module

En la primera línea hemos creado una instancia de la clase COrdenador llamada
miordenador.

A continuación queremos dar valores a los atributos del ordenador y utilizar los
métodos para obtener la información que queramos.

Vamos a dar el valor Toshiba al atributo m_marca .

miordenador.m_marca=”Toshiba”

sin embargo vemos que cuando escribo la instancia miordenador. solamente
apareceden los métodos de la clase y no los atributos.

2VBNET 29
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

¿A que es debido? ¿Por qué no aparecen los atributos de la clase?. Muy sencillo
porque se han definido como privates y por lo tanto solamente pueden acceder a
ellas los métodos definidas en la misma clase.
¿Cómo se puede solucionar? Mediante la definición de propiedades, ésta permiten
acceder a un atributo privado como si estuviera definido como publico. Para
implementar una propiedad se hace:

Definimos Public Property nombre_propiedad() as tipo y automáticamente se
genera el siguiente código:

Public Property marca() As String
Get
‘ se devuelve el valor del atributo
End Get
Set(ByVal value As String)
‘ se asigna el valor al atributo
End Set
End Property

Con la sentencia get se obtiene el valor que tiene en ese momento el atributo en
nuestro caso m_marca para ello debemos añadir entre Get End Get la sentencia
return m_marca

Con la sentencia set asignamos el valor que se recibe a través del parámetro value
(en nuestro ejemplo le cambiamos de nombre y ponemos dato) al atributo en
nuestro caso m_marca.

Nosotros además vamos a añadir más código de forma que si el valor es vacio
indicaremos que la marca es desconocida y sino guardamos con el valor recibido.

Set(ByVal dato As String)
If (dato = Nothing) Then
m_marca = "marca desconocida"
Else
m_marca = dato
End If
End Set

Luego la propiedad debe quedar de la siguiente forma:

Public Property marca() As String
Get
Return m_marca
End Get
Set(ByVal dato As String)
If (dato = Nothing) Then
m_marca = "marca desconocida"

2VBNET 30
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

Else
m_marca = dato
End If
End Set
End Property

Ahora si intentamos acceder a este atributo desde nuestro modulo MOrdenador
veremos que si podemos.

Public Sub Main()
Dim miordenador As COrdenador = New COrdenador()
miordenador.marca = "Toshiba"
miordenador.EncenderOrdenador()
miordenador.Estado()
End Sub

Con la orden miordenador.marca = "Toshiba" invocaría a Set de marca.

EJERCICIO1 A REALIZAR: crea los métodos que quedan y cambia el programa
principal para que salga la siguiente información. También deberás controlar que el
peso del ordenador no sea inferior a 0.

2VBNET 31
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

EJERCICIO 2 RESUELTO

Vamos a realizar una clase que representa números racionales. Esta clase puede
ser útil porque muchos números no pueden ser representados exactamente
utilizando un número fraccionario. Por ejemplo, el número racional 1/3
representado como fraccionario sería 0,33333, valor mas facil de manipular pero a
costa de perder precisión.

Pensando un número racional como si fuera un objeto, deducimos que sus atributos
son : el numerador y el denominador. Y los métodos aplicables sobre los números
racionales son numerosos: suma, resta, multiplicación, …
Nosotros vamos añadir otros dos métodos: AsignarDatos, para establecer los
valores del numerador y el denominador; y otro, VisualizarRacional, para visualizar
un número racional.

1. Creamos un proyecto en modo consola y lo denominamos Quebrados.vbprj
2. Creamos la clase CRacional.vb

Class CRacional
Private Numerador As Integer
Private Denominador As Integer

Public Sub AsignarDatos(num As Integer, den As Integer)
Numerador = num
If den = 0 Then den = 1 ' el denominador no puede ser cero
Denominador = den
End Sub

Public Sub VisualizarRacional()
System.Console.WriteLine(Numerador & "/" & Denominador)
End Sub
End Class

3. Creamos el modulo Racionales.vb

Module Racionales
Public Sub Main()
' Punto de entrada a la aplicación
Dim r1 As CRacional = New CRacional() ' crear un objeto CRacional

r1.AsignarDatos(2, 5)
r1.VisualizarRacional()
End Sub
End Module

2VBNET 32
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

EJERCICIOS

1. Crea un formulario con una clase que te represente, con propiedades que
describan el color de tu pelo, de tus ojos y tu fecha de nacimiento.
Crea dos métodos uno para obtener el día de la semana en que naciste y otro
para indicar la nacionalidad en función del color del pelo y de los ojos.
Utiliza la propiedad dayofweek del tipo de dato datetime para determinar el
día de la semana en que naciste. La propiedad devuelve un entero, conviértelo
al día de la semana.

El formulario inicialmente tendrá el siguiente aspecto:

Se seleccionará el color del pelo y el color de los ojos. A continuación se pulsará el
botón Ver donde aparecerá una ventana indicando que se introduzca la fecha de
nacimiento:

Una vez introducida la fecha en el cuadro de texto aparecerá la siguiente
información:

2VBNET 33
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

2. Diseñar una clase CCoche que represente coches. Sus atributos serán marca,
modelo, coche y marcha; y los métodos deberan simular, enviando mensajes,
las acciones arrancar el motor, cambiar de velocidad, acelerar, frenar , parar
coche y describir el coche. De forma que cuando se ejecute la aplicación salga
de la siguiente forma:

3. Diseña una clase Persona que representa a las personas.

Sus atributos serán elnombre, elapellido, lafecha_nacimiento.
Sus propiedades nombre() para obtener el nombre en mayúsculas, apellido( )
para obtener el apellido en minúsculas y fecha_nacimiento( ) para obtener la
fecha de nacimiento no sea inferior a 1900.
Una propiedad edad ()de solo lectura que me permita obtener la edad en
función de la fecha de nacimiento.
Una propiedad hijo(indice) que permita asociar un hijo o más hijos a una
persona. Para ello se tendrá que crear un nuevo campo en la clase persona para
asegurar que se guarda la lista de hijos. Este campo será un array de dimensión
9 de tipo personas.
La propiedad hijo recibe por parámetro un índice que permite especificar el hijo
con el que deseamos trabajar.

Crea un formulario de forma que al pulsar el botón Mostrar datos muestre los datos
de una persona utilizando la clase persona. Un ejemplo:

2VBNET 34
Visual .NET
Microsoft Visual Studio 2005 Unidades Didáctica 21

2VBNET 35