Sunteți pe pagina 1din 421

Tcnicas de

Programacin
Orientada a
Objetos

Presentacin..3

Modulo A

Semana 1: Arreglos Lineales y Matrices ...4

Semana 2: Ordenamiento de datos y Bsqueda de Datos..28


Semana 3: Programacin Orientada a Objetos 40
Semana 4: Manejo de la Clase String 72
Semana 5: Manejo de Archivos .....81
Semana 6: Clases Primitivas .99
Semana 7: Mtodos propios 116
Semana 8: Ejercicios de Aplicacin.127
Semana 9: Manejo de Capas en una aplicacin en escritorio133

Modulo B
Semana 1: Introduccin a la Plataforma .NET136
Semana 2: Uso de Estructuras de Control..194
Semana 3: Introduccion a la Estructura de Datos(Arreglos).233
Semana 4: Procedimientos y Funciones...239
Semana 5: Funciones de Sistema y Formatos ..284
Semana 6: Programacion Orientados a Objetos.308
Semana 7: Manejo de Colecciones350
Semana 8: Manejo de Archivos392
Semana 9: Manejo de Streams de Datos y Archivos412

Bibliografa: 421

Tcnica de Programacin Orientada a Objetos

PRESENTACIN
Esta gua didctica es un material de ayuda institucional, perteneciente a las
especialidades de computacin, Ingeniera de Software e Ingeniera de Redes y
Comunicaciones tiene por finalidad proporcionar los conocimientos de la
programacin orientada a Objetos a los estudiantes del segundo ciclo de estudios.
La Organizacin SISE, lder en la enseanza tecnolgica a nivel superior, promueve
la elaboracin de materiales educativos, en concordancia a las exigencias de las
tecnologas de estos tiempos, que permiten la creacin de nuevas herramientas de
aprendizaje con el objetivo de facilitar el acceso de los estudiantes a la educacin en
el marco del desarrollo tecnolgico de la informtica de las telecomunicaciones.
Esta gua se divide en 2 mdulos y cada una de ellas en 9 semanas. Permite conocer
las herramientas indispensables para la elaboracin de aplicaciones con el uso de la
tcnica O.O. Se inicia con el uso de tcnica en manejo de datos en memoria y en el
manejo de capas donde estas tcnicas bsicas se necesitan para dar solucin a una
determinada proposicin o problema.
En este proceso el alumno aprender instrucciones que le permitirn evaluar
expresiones para luego procesar un conjunto de sentencias. Tambin aprender el
manejo de una aplicacin a nivel de contenedores.
La implementacin y uso de Capas dentro de la aplicacin en escritorio permitirn que
el alumno aplique la tcnica Orientada a objetos.
Todas estas herramientas darn un soporte solido al alumno para aprender a
programar en cualquier lenguaje Orientada a Objetos(JAVA, .NET, Visual C,etc).
Este material en su primera edicin, servir para ayudar a nuestros estudiantes
SISESINOS.

Tcnica de Programacin Orientada a Objetos

Arreglos

Contenidos
-

Concepto de Arreglos :Declaracin, asignacin e inicializacin de memoria a un arreglo


Acceso Secuencial y Aleatorio. Agregar Datos.
Arreglos con uso de Estructuras Condicionales: Uso de Contadores y Acumuladores.
Uso del JList (defaultListModel)
Definicin de matrices: Acceso a elementos de una matriz: Asignacin de Datos:
Matrices: Definicion,Asignacion, Ingreso.
Uso del JTable(DefatultTableModel), (setElementAt(), getSelectedRow(),
getSelectedColum(), changeSelection(), addRow(),etc).

____________________________________________________________________________

ARREGLOS LINEALES
Un arreglo es una coleccin de datos del mismo tipo, que se almacenan en posiciones
consecutivas de memoria y reciben un nombre comn. Para referirse a un determinado
elemento de un arreglo se deber utilizar el nombre del arreglo acompaado de un ndice el
cual especifica la posicin relativa en que se encuentra el elemento.

Los arreglos pueden ser:

Unidimensionales (vectores).

Bidimensionales (matrices, tablas).

Multidimensionales (tres dimensiones o ms).

Declaracin de un arreglo:
<tipo de dato>: nombre_variable [Tamao]

Tcnica de Programacin Orientada a Objetos

Con esto diremos que se est definiendo un atributo de tipo arreglo y estamos
determinando el tipo de dato y el tamao de registros.

Ejemplos:
entero: Numeros[10]
decimal: talla [5]
caracter nombres [8]

Asignacin de datos hacia a un arreglo:

nombre_variable[ndice] = <expresin del tipo>

Esta instruccin asigna el valor asociado de la expresin a la posicin ndice del


arreglo nombre_variable. El ndice debe ser una expresin del tipo entero en el rango
[0, longitud-1].

Ejemplos: Estableciendo Datos a los Arreglos


Numero[2]=152

talla[4]=170.5

nombre[6]=Vernica

Numero[5]=115

talla[0]=168.52

nombre[3]=William

Numero[10]=652

talla[2]=102.62

nombre[1]=Angie

Numero[0]=52

talla[1]=85.62

nombre[8]=Sebastian

Los datos establecidos en Memoria serian as:


Arreglo Numero
ndice
0
Valores
52

ndice
Valores

ndice
Valores

1
0

2
152

Arreglo Talla
0

Arreglo
Nombres
0
null

3
0

5
115

168.52

1
Angie

4
0

2
null

7
0

8
0

9
0

85.62

102.6 0

5
null

4
William null

Tcnica de Programacin Orientada a Objetos

6
0

10
652

170.5 0

7
Vernica null

8
Sebastin

Nota: las posiciones que no se le asignaron datos quedaran vacios (0) en el


caso de ser numero y null en el caso de carcter.

Acceso al contenido de un arreglo:


Para poder acceder al contenido:
a. escribir: Obtener el dato de acuerdo al ndice establecido, para ello se deber mostrar
dicho dato, lo cual se podr utilizar una variable o mostrarlo directamente.Aqu tambin
vale la aclaracin de que el ndice debe estar dentro del rango de definicin del arreglo.

Variable=nombre_Arreglo[ndice]
escribir (Variable) o escribir (nombre_Arrgelo[indice)
Ejemplo:
X=nombre[1]
escribir(X)

el resultado ser Angie

_________________________________________________________
escribir (nombre[8])

el resultado ser Sebastin

b. Leer: se podr ingresar datos al arreglo en forma contigua de acuerdo al ndice. Es por
ello que se usara a una estructura iterativa que puede ser Mientras(while), Desde (do)
o Repetir(do..while).
Leer(Arreglo[indice])
Nota Para que esta lectura se repita hasta el total de tamao del arreglo se deber de
usar a una estructura Iterativa.

Un Ejemplo con l Desde


desde(x=1 hasta 10)
leer(Arreglo[x])
escribir(Arreglo[x])
fin_desde

Tcnica de Programacin Orientada a Objetos

Los pasos para la utilizar un vector:


1. Declarar el vector: Consiste en establecer el nombre, el tamao y el tipo de los datos
que se van a almacenar en el arreglo ejemplo:
Hay que diferenciar dos trminos:
tamao del vector (T): es el nmero mximo de elementos que puede contener el
vector.
Numero de elementos(N): que indica cuantos elementos hay almacenados en el
arreglo en determinado momento. Nota N<=T.

T = 10;
decimal :notas[T]
2. Llenar el vector con los datos: Se puede hacer en el momento de la declaracin
asignando al vector los valores que necesitamos almacenar.
Ejemplo.
notas[10] = {2.3 , 3.5 , 4.2 , 3.3 , 3.0 , 4.9 , 4.2 , 3.0 , 2.0 , 1.5 };
recorriendo el arreglo as dndole nuevos valores:
desde(i = 1 hasta N)
leer( notas[i] )
fin_desde
3. Manipular la informacin guardada en el vector. Para esto es necesario recorrer dicha
estructura y se puede hacer de la siguiente manera.
desde(i = 1 hasta N)
escribir ( notas[i] )
fin_desde
Tambien se puede leer y a la vez escribir los datos ingresados al arreglo

desde(i = 1 hasta N)
leer( notas[i] )
escribir ( notas[i] )
fin_desde

Operaciones que se pueden realizar con los arreglos


Son las siguientes:

Lectura (llenar el vector)


Escritura (escribir el vector)
Asignacin (dar valor a una posicin especfica)
Actualizacin (insercin , eliminacin, modificacin )
Ordenacin . (burbuja, insercin directa, seleccin directa, selle y quicksort).

Tcnica de Programacin Orientada a Objetos

Bsqueda. (secuencial, binaria, hash( por claves) ).

Ejemplos:
1. Crear un Arreglo que permita ingresar 10 Apellidos.

caracter: Apellidos[10]
desde(i =1 hasta 10)
leer(Apellidos[i] )
escribir (Apellidos [i] )
fin_desde

2. Crear un Arreglo que permita ingresar 15 promedios del aula 307 del curso de
fundamentos de programacin

decimal: Promedios[15]
desde(i = 1 hasta 15)
leer(Promedios[i] )
escribir (Promedios [i] )
fin_desde

3. Crear un Arreglo que permita ingresar 20 Nombres de Institutos y Zona de


ubicacin.
Constante N=20
Carcter: Institutos[N]
Carcter: Zonas[N]

desde(i = 1 hasta N)
leer(Institutos[i] )
leer(Zonas[i] )
escribir(Institutos[i])
escribir (Zonas[i] )
fin_desde

Tcnica de Programacin Orientada a Objetos

4. Crear un Arreglo que ingrese 50 datos numricos enteros.


Constante N=50
entero: Numeros[N]
desde(i = 1 hasta N)
leer(Numeros[i] )
escribir(Numeros[i])
fin_desde

5. Crear un Arreglo que ingrese 10 promedios y escribir cuantos estn aprobados y


cuantos desaprobados.
Constante N=10
decimal: Promedios[N]
desde(i = 1 hasta N)
leer(Promedios[i] )
escribir (Promedios [i] )
si(Promedios[i]>=10.5)
ca=ca+1
sino
cd=cd+1
fin_si
fin_desde
escribir(Total de Aprobados: ,ca)
escribir(Total de Desaprobados: ,cd)

Tcnica de Programacin Orientada a Objetos

6. Crear un Arreglo que ingrese 15 reas y sus respectitos Sueldos y mostrar cuantos
son del rea de Sistemas,Contabilidad,
Cuantos superan al sueldo mnimo
Cuntos ganan entre 1000 y 2500.
Constante N=15
entero:Sueldo[N]
Carcter:Area[N]
desde(i = 0 hasta N-1)
leer(Sueldo[i] , Area[i] )
escribir (Sueldo[i] , Area[i] )
si(Area[i]=Sistema)entonces
cs=cs+1
fin_si
si(Area[i]=Contabilidad) entonces
cc=cc+1
fin_si
si(Sueldo[i]>650) entonces
csum=csum+1
fin_si
si(Sueldo[i]>=1000 y Sueldo[i]<=2500) entonces
cr=cr+1
fin_si
fin_desde
escribir(Total del rea de Sistemas: ,cs)
escribir(Total del rea de Contabilidad: ,cc)
escribir(Total de Empleados que ganan ms que el sueldo mnimo: ,csum)
escribir(Total de Empleados que ganan entre 1000 y 2500: ,cr)

Tcnica de Programacin Orientada a Objetos

10

USO DE ARREGLOS EN JAVA


Una matriz es una estructura que contiene mltiples valores del mismo tipo. La longitud de un
array se establece cuando se crea un arreglo (en tiempo de ejecucin).
Se pueden declarar en Java Arreglos de cualquier tipo:

Para definir un Arreglo se usa la palabra clave new.

La palabra clave new se usa para crear una instancia de la clase.


Antes de ser instanciada con new no consume memoria, simplemente es una declaracin de
tipo. Por ejemplo:
// Solo definir a un identificador como tipo arreglo.
char nombreJugadores [];
int edades[];

// Definir el arreglo con su tamao especifico


String [ ] nombreJugadores = new String [10];
int [ ] edades = new int [99];
int[] a_Nac= new int[5];
int[] codigo = new int[4];
O se puede crear ya el arreglo con sus valores inciales:

String nombres[] = { "Veronica","William","Angie","Sebastian"};

Esto que es equivalente a:


String nombres[]= new String[4];
nombres[0] = new String( "Veronica);
nombres[1] = new String( "William");
nombres[2] = new String( "Angie");

Tcnica de Programacin Orientada a Objetos

11

nombres[3] = new String( "Sebastin" );

Otro Ejemplo:
String [ ] Coordinadores={Vernica Escobar, Vctor Snchez,Rogelio Tello,Carlos Monge};
O Tambin:
Coordinadores [0] = " Vernica Escobar ";
Coordinadores [1] = " Vctor Snchez ";
Coordinadores [2] = " Rogelio Tello ";
Coordinadores [3] = "Carlos Monge";

Casos Prcticos
1. Ejemplo ingresando valores aleatorios al arreglo:
private void btnAgregar_actionPerformed(ActionEvent e) {
modLstf.clear();
int Numeros[]=new int[10];
for( int i=0; i < 10; i++ ){
Numeros[i] = (int)(Math.random()*100)+1;

Se usara el random para


poder establecer nmeros
aleatorios en este caso
ser desde 1 al 100.

modLstf.addElement((i+1)+".- "+Numeros[i] );
}
}

Tcnica de Programacin Orientada a Objetos

12

2. Almacenar los votos obtenidos por los 20 candidatos. Estos son ingresados por el usuario.
private void btnAgregar_actionPerformed(ActionEvent e) {
int votos[]=new int[20]; //Declara el Arreglo en forma Local
modLstf.clear(); //Limpia todo el contenido de la lista
for( int i=0; i < 20; i++ ){
votos[i] = Integer.parseInt(JOptionPane.showInputDialog( "Ingresar Cantidad de
Votos - "+(i+1)));

modLstf.addElement((i+1)+".- "+votos[i] );
}
}

Tcnica de Programacin Orientada a Objetos

13

3. Se tiene una lista llamado Amigos: Vernica E., Gelnda D., Victor S., Rogelio T., Waldir C.,
Eduardo A., Carlos M., Henrry Q., Miguel F., Manue T, Juan C.. Se necesita almacenarlo
en un Arreglo y mostrarlo.

private void btnAgregar_actionPerformed(ActionEvent e) {


String Amigos[]={"Vernica E.","Glenda D.","Victor S.","Waldir C.","Rogelio R.",
"Eduardo A.","Carlos M.","Henrry Q.","Miguel F.","Manuel T.","Juan C."};

El length se usa para ver el total de


elementos que tiene el arreglo.
for( int i=0; i < Amigos.length; i++ ){
modLstf.addElement((i+1)+".- "+Amigos[i] );
}
}

Este mtodo length


devuelve un valor
numrico entero

4. Se pide crear una lista que almacene 10 registros: estos datos sern Apellidos, edades y
distritos del aula 307.
private void btnAgregar_actionPerformed(ActionEvent e) {
final int t=10;
int edades[]=new int[t];
String apellidos[]=new String[t];
String distritos[]=new String[t];
for( int i=0; i < t; i++ ){

Tcnica de Programacin Orientada a Objetos

14

apellidos[i] = JOptionPane.showInputDialog("Registro nro. "+(i+1)+"\n"+"Ingresar Apellidos:");


edades[i] = Integer.parseInt(JOptionPane.showInputDialog("Ingresar Edad"));
distritos[i] =JOptionPane.showInputDialog("Ingresar Distrito:");
modLstf.addElement((i+1)+".- "+apellidos[i] );
modLstE.addElement(edades[i]);
ModLstD.addElement(distritos[i]);
}

5. Modificando el programa anterior, tambin deber de visualizar cuantos son mayores a 31


o menores e iguales que 31. Cuntos son del distrito de Surco o Chorrillos.

Tcnica de Programacin Orientada a Objetos

15

public class FrmCAso01 extends JFrame {

final int t=5;


int edades[]=new int[t];
String apellidos[]=new String[t];
String distritos[]=new String[t];

Estos arreglos deben ser


variable Globales debido a
que es llamado en botones
diferentes.
El atributo t es una
constante donde indica el
tamao de los Arreglos.

private void btnAgregar_actionPerformed(ActionEvent e) {


for( int i=0; i < t; i++ ){
apellidos[i] = JOptionPane.showInputDialog("Registro nro. "+(i+1)+"\n"+"Ingresar Apellidos:");
edades[i] = Integer.parseInt(JOptionPane.showInputDialog("Ingresar Edades"));
distritos[i] =JOptionPane.showInputDialog("Ingresar Distrito:");
modLstf.addElement((i+1)+".- "+apellidos[i] );
modLstE.addElement(edades[i]);
ModLstD.addElement(distritos[i]);
}

private void btnReporte_actionPerformed(ActionEvent e) {


int cc=0,cmay=0,cme=0;
for( int i=0; i < t; i++ ){
if(distritos[i].equalsIgnoreCase("Surco") | distritos[i].equalsIgnoreCase("Chorrillos"))
cc=cc+1;
if(edades[i]>31)
cmay=cmay+1;
else
cme=cme+1;
}
txtsalida.append("* Total del Distrito de "+"\n"+"Surco o de Chorrillos son: "+cc+"\n");
txtsalida.append("* Total de Mayores de 31 Aos son: "+cmay+"\n");

Tcnica de Programacin Orientada a Objetos

16

txtsalida.append("* Total de Menores o iguales a 31 Aos son: "+cme+"\n");


}

Tcnica de Programacin Orientada a Objetos

17

ARREGLOS BIDIMENSIONALES
MATRICES
La utilizacin de matrices constituye actualmente una parte esencial de los lenguajes de
programacin, ya que la mayora de los datos se introducen en los ordenadores como tablas
organizadas en filas y columnas: hojas de clculo, bases de datos, Archivos, etc.
Se llama matriz de orden mn a todo conjunto rectangular de elementos Matriz(m)(n)
dispuestos en m lneas horizontales (filas) y n verticales (columnas) de la forma:

Columnas

Recordemos que los


Arreglos o Matrices
empiezan desde la
posicin cero tanto para
las filas y columnas.

0
1
2
3

Filas

Definir una matriz


<tipo de dato>: nombre_variable[Filas][Columnas]

Ejemplo:
a) Entero: Numeros[5][3]
Cuando se define este espacio en memoria para las matrices establece este espacio.

0
1
2
3
4
b) Caracter: Letras[2][5]

0
1

Tcnica de Programacin Orientada a Objetos

18

Asignacin de datos hacia una Matriz:


nombre_variable[ndiceFila] [ndiceColumna] = <expresin del tipo>

Ejemplos: Estableciendo Datos a una Matriz

Asignar aos de nacimiento a la Matriz Numeros.


Numeros[0][1]=1975
Numeros[1][2]=1972
Numeros[3][1]=1999
Numeros[4][2]=2004

Asignar Letras a la Matriz Letras


Letras[0][0]=V
Letras[0][1]=E
Letras[0][2]=R
Letras[0][3]=O
Letras[0][4]=N
Letras[1][0]=I
Letras[1][1]=C
Letras[1][2]=A

Acceso al contenido
Para poder acceder al contenido:

de una Matriz:

a. Escribir: Obtener el dato de acuerdo al ndice establecido, para ello se deber mostrar
utilizando una variable o mostrndolo directamente.

Variable=Matriz[ndiceFila] [ndiceColumna]
Escribir(Variable) o

Mostar(Matriz[ndiceFila] [ndiceColumna])

Ejemplo:
X=Letras[0][3]
Escribir(X)

el resultado ser O

_________________________________________________________
Escribir(Letras[0][0])

Tcnica de Programacin Orientada a Objetos

el resultado ser V

19

b. Lectura: se podr ingresar datos al arreglo en forma contigua de acuerdo al ndice. Es


por ello que se usara a una estructura iterativa anidad que puede ser Mientras(while),
Desde (for) o Repetir(do..while).
Leer(Matriz[ndiceFila] [ndiceColumna])
Nota: Para que esta lectura se repita hasta el total de tamao del arreglo se deber de
usar a una estructura Iterativa anidada que permitir realizar el recorrido de filas y de las
columnas o viceversa(Columnas o Filas).

Llenar datos a la matriz:


Ejemplo. Recorriendo la Matriz dndole nuevos valores:
desde(f=1 hasta Filas)
desde(c =1 hasta Columnas)
leer( numeros[f][c] )
fin_desde
fin_desde

4. Manipular la informacin guardada en la Matriz. Para esto es necesario recorrer dicha


estructura y se puede hacer de la siguiente manera.
desde(f = 1 hasta Filas)
desde(c = 1 hasta Columnas)
escribir( numeros[f][c] )
fin_desde
fin_desde

Tambin se puede leer y a la vez escribir los datos ingresados al arreglo


desde(f =1 hasta Filas)
desde(c =1 hasta Columnas)
leer( numeros[f][c] )
escribir( numeros[f][c] )
fin_desde
fin_desde

Tcnica de Programacin Orientada a Objetos

20

Operaciones que se pueden realizar con los arreglos

Lectura (llenar datos de la matriz)


Escritura (escribir datos de la matriz)
Asignacin (dar valor a una posicin especfica)
Actualizacin (insercin , eliminacin, modificacin )

Ejemplos:
En una matriz de dimensiones 5x4 hallar el mayor valor y el menor valor.
Variables
Fi=5
Co=4
Entero: Datos[Fi][Co]
Inicio
mayor=0; menor=1000;
desde(x=0 hasta Fi-1)
desde (y=0 hasta Co-1)
leer(Datos [x] [y])
si (Datos [x] [y]> mayor)
mayor= matriz [x] [y]
si (Datos [x] [y]< menor)
menor= matriz [x] [y]
fin_desde
fin_desde
escribir(mayor, menor)
fin_programa

Tcnica de Programacin Orientada a Objetos

21

USO DE MATRICES con el control JTABLE


Java posee la capacidad de definir un conjunto de variables del mismo tipo, agrupadas todas
ellas bajo un mismo nombre, y distinguindolas mediante un ndice numrico.
Para definir un arreglo o Matriz en java es como definir una variable o atributo, pero al
especificar el tipo lo que hacemos es colocar un par de corchetes [] para indicar que lo que
estamos definiendo es un arreglo o Matriz.

Para definir una Matriz se realiza de la siguiente manera:

Tipo_de_Dato variables[ ] [ ] = new Tipo_de_Dato [fila] [columna];


Por ejemplo definicin de Matrices:

int numero[][]=new int[5][3];

double sueldos[][]=new double[10][2];

String apellidos[][]=new String[5][4];

boolean estado [][]=new boolean[6][4];

Asignar datos:
numero[0][0]=123;
numero[0][1]=456

Leer datos:
//solo indica el ingreso para esa posicin de la matriz

nmeros[0][2]=Integer.parseInt(JOptionPane.showInputDialog(Ingresar Numero));
En el caso que se desee realizar para toda la matriz debers de usar a una estructura
anidada para el ingreso. Por ejemplo:
//Definimos el total de filas y columnas
final int filas=5;
final int columnas=3;
int numero[][]=new int[filas][columnas];
for(int y=0;y<filas;++y){
for(int x=0;x<columnas;++x){
numero[y][x]= Integer.parseInt(JOptionPane.showInputDialog(Ingresar
Numero));
}
}

Tcnica de Programacin Orientada a Objetos

22

Uso del JTable

Jtable es una clase que me permite organizar una determinada informacin en tabla, esta
difiere de una base de datos normal porque al utilizar Jtable t puedes visualizar esta tabla,
brindndole al usuario organizacin de informacin, oportunidades de editar y cambiar el
tamao de las columna entre otras.
Jtable le da al programador muchas facilidades, pues este posee varias caractersticas que
permiten hacer desde tablas con informacin compleja y muy estructurada hasta tablas con
informacin sencilla y "bsica".

DefaultTableModel
La clase Jtable controla como se presentan los datos, para crear un Jtable habr pues que
crear un DefaultTableModel antes. DefaultTableModel lo que hace es predeterminar ciertas
caractersticas para el Jtable, es decir que tu puedes poner ciertos parmetros dentro de un
DefaultTableModel y as no tener que determinarlos siempre. DefaulTableModel guarda los
datos de la tabla para s mismo, es decir, puede tener la informacin de la tabla pero estos
datos son los visualizados por el computador, es decir, para visualizar una tabla el
DEFAULTTABLEMODEL puede tener la informacin pero sin el Jtable no se puede visualizar
para el usuario.
EDITABLE O NO?
Jtable tiene una caracterstica muy llamativa, este permite que el programador pueda decidir
que se edita y que no, sin embargo si el programador dentro de su programa o de su
DEFAULTTABLEMODEL no tiene determinado este aspecto, Jtable automticamente hace
editable las celdas dentro de la tabla.
LA INFORMACIN, Y LAS COLUMNAS?
Jtable te brinda muchas facilidades para poder crear una tabla, y as mismo de llenarla con la
informacin que desees ( nmeros, letras etc...) por lo que sencillamente dentro de una tabla
esta automticamente esta a travs de la informacin debidamente separada - por ""(comillas)
o por , (coma) - es capaz de contabilizarlas y al mismo tiempo llenarla con la informacin que
se le dio; es decir el programador solo se debe encargar de poner los ttulos de las tablas y as
mismo de escribir la informacin en el mismo orden en que desee que salga de acuerdo con los
ttulos y Jtable se encargara automticamente de colocar la informacin donde se le indico.
UN CHECK BOX?
Para un CellRendered con un DefaultTableModel sencillo, tal vez identificar clases pueda ser
algo ms complejo que no pueda hacer, pero para uno un poco ms avanzado, esto sera muy
fcil, y para esto cito el caso de un CHECK BOX(casilla de verificacin) el cual es un
componente grafico generado por Jtable despus de que identifica una informacin tipo
boolean, dndole as la apariencia de un cuadro rellenable, un check box no es ms que eso,
una opcin - que puede ser editable o no.
UN LIST BOX?
En algunas oportunidades, para cierto tipo de informacin que deseamos que el usuario
complete, necesitamos darle a el usuario, cierto tipo de opciones cosa que a travs de un List
Box tu puedes ofrecer al usuario el tipo de respuestas que tu desees que selecciones, este tipo
de organizacin de informacin ya no es tan sencillo como declarar una informacin tipo
boolean, toca crear la lista.

Tcnica de Programacin Orientada a Objetos

23

Creacin y enlace de un JTable


Insertar el JTable
por ejemplo:

y definir la clase DefaultTableModel en el public class

DefaultTableModel modTbDatos=new DefaultTableModel();

En el mtodo jbInit establecer el enlace del modal y el total de filas y columnas.

jTable1.setModel(modTbDatos);
modTbDatos.setColumnCount(3);
modTbDatos.setRowCount(5);
Ejemplo 01:

Crear una Matriz de 5 X 3 y llenar datos numricos enteros.


Realizar el procedimiento de creacin y enlace del Jtable.

private void btnAgregar_actionPerformed(ActionEvent e) {


final int filas=5;
final int columnas=3;
int numero[][]=new int[filas][columnas];
for(int y=0;y<filas;++y){
for(int x=0;x<columnas;++x){
numero[y][x]= Integer.parseInt(JOptionPane.showInputDialog("IngresarNumero"));
modTbDatos.setValueAt(numero[y][x],y,x);
}
}
}

Tcnica de Programacin Orientada a Objetos

24

Ejemplo 02:

Escribir los resultados de las tablas de multiplicar hasta el 10.

Realizar el procedimiento de creacin y enlace del Jtable.

private void btnAgregar_actionPerformed(ActionEvent e) {


final int MAXT = 11;
int [] [] tabla = new int [MAXT][MAXT];
//Se inicializan los valores de tabla
for (int i = 0; i < MAXT; i++)
for (int j = 0; j < MAXT; j++)
tabla [i][j] = i*j;
//Se imprime tabla
//se muestran los resultados que tenga la matriz
for (int i = 0; i < MAXT; i++) {
for (int j = 0; j < MAXT; j++)
modTbDatos.setValueAt(tabla [i][j],i,j);
}
}

Ejemplo 03:
Crear 2 vectores Apellidos y Edades que almacenen 15 registros y debern ser
presentados en el JTable por columnas.

private void btnAgregar_actionPerformed(ActionEvent e) {


final int filas=15;
int Edad[]=new int[filas];
String apellidos[]=new String[filas];
for (int i = 0; i < filas; i++){
apellidos[i]=JOptionPane.showInputDialog("Ingresar Apellidos");
Edad[i]=Integer.parseInt(JOptionPane.showInputDialog("Ingresar Edad"));
modTbDatos.setValueAt(apellidos[i],i,0);
Tcnica de Programacin Orientada a Objetos

25

modTbDatos.setValueAt(Edad[i],i,1);
}
}

Tcnica de Programacin Orientada a Objetos

26

BALOTARIO DE EJERCICIOS USANDO VECTORES Y MATRICES


1. Dado un vector de nmeros reales:
a) Escriba un mtodo max que nos devuelva el mximo de los valores incluidos en el
vector.
b) Escriba un mtodo min que nos devuelva el mnimo de los valores incluidos en el
vector.
c) Escriba un mtodo media Aritmtica que nos devuelva la media de los valores
incluidos en el vector.
d) Dado un vector de nmeros reales, escriba un mtodo que nos devuelva el mximo
y el mnimo de los valores incluidos en el vector.
e) Dado un vector, implemente un mtodo que inserte un elemento en una posicin
dada del vector.
f) Realizar programas que definan un vector de 10 elementos inicializado con valores
enteros cualesquiera, tanto negativos como positivos y hagan lo siguiente:
Mostrar por pantalla el contenido del vector
Mostrar por pantalla el contenido del vector en orden inverso.
Mostrar la suma de los valores del vector
Indicar el mximo y el mnimo de los valores del vector.
Hallar la media aritmtica de aquellos valores que sean mayores que 20 y
menores que 80.
Indicar cuantos hay pares y si hay alguno primo.
2. Realizar un programa al que se le vayan introduciendo por teclado nmeros enteros. El
programa dispone de dos vectores, uno llamado positivos y otro negativo, ambos de 8
posiciones. Se trata de meter los nmeros introducidos en uno u otro segn su signo
hasta que se llenen los dos. El programa avisar si se intenta meter un nmero
(positivo o negativo) cuando el vector correspondiente est lleno. Finalmente el
programa nos
a) informar de la suma de todos los elementos guardados en los vectores.
b) El promedio de lo positivos
c) Cuantos nmeros + fueron mayores a 100.

3. Realizar
un
subprograma
llamado
llenar_vector_sin_repet
igual
que
llenar_vector_10_elem pero que no introduzca repetidos. Realizar un programa que lo
utilice y muestre por pantalla el contenido del vector.
4. Dada una matriz de 10 x 10, mostrar la suma de las filas y columnas
a) Que fila obtuvo la suma mayor
b) Que columna obtuvo la suma menor.
c) El numero mayor
d) El promedio de la suma
e) El promedio de la columna.

Tcnica de Programacin Orientada a Objetos

27

Contenidos
-

Definir Ordenamientos de Datos: Mtodo de Burbuja, Mtodo Shell.


Definicin de Bsqueda: Tipos Bsqueda de Datos dentro de un Arreglo.
Tipos de Bsquedas: Bsqueda Lineal - Bsqueda Binaria.

____________________________________________________________________________

Algoritmos de Ordenamiento
Ordenar es simplemente colocar informacin de una manera especial basndonos en un
criterio de ordenamiento.

Mtodos de ordenamientos.
Existen diferentes mtodos de ordenamiento entre ellas tenemos por Seleccin, Insercin,
Quick Sort, Burbuja, Shell, etc. Dentro de las cuales hablaremos de los mtodos:
El hecho de que la informacin est ordenada, nos sirve para poder encontrarla y accesarla de
manera ms eficiente ya que de lo contrario se tendra que hacer de manera secuencial.
A continuacin se describirn 4 grupos de algoritmos para ordenar informacin:

Algoritmos de insercin:
En este tipo de algoritmo los elementos que van a ser ordenados son considerados uno a la
vez. Cada elemento es INSERTADO en la posicin apropiada con respecto al resto de los
elementos ya ordenados.
Entre estos algoritmos se encuentran el de INSERCION DIRECTA, SHELL SORT, INSERCION
BINARIA y HASHING.

Algoritmos de intercambio:
En este tipo de algoritmos se toman los elementos de dos en dos, se comparan y se
INTERCAMBIAN si no estn en el orden adecuado. Este proceso se repite hasta que se ha
analizado todo el conjunto de elementos y ya no hay intercambios.
Entre estos algoritmos se encuentran el BURBUJA y QUICK SORT.

Tcnica de Programacin Orientada a Objetos

28

Algoritmos de seleccin:
En este tipo de algoritmos se selecciona o se busca el elemento ms pequeo (o ms grande)
de todo el conjunto de elementos y se coloca en su posicin adecuada. Este proceso se repite
para el resto de los elementos hasta que todos son analizados.
Entre estos algoritmos se encuentra el de SELECCION DIRECTA.

Algoritmos de enumeracin:
En este tipo de algoritmos cada elemento es comparado contra los dems. En la comparacin
se cuenta cuntos elementos son ms pequeos que el elemento que se est analizando,
generando as una ENUMERACION. El nmero generado para cada elemento indicar su
posicin.
Los mtodos simples son: Insercin (o por insercin directa), seleccin, burbuja y shell, en
dnde el ltimo es una extensin al mtodo de insercin, siendo ms rpido. Los mtodos ms
complejos son el quick-sort (ordenacin rpida) y el heap sort.
A continuacin se mostrarn los mtodos de ordenamiento ms simples.

Mtodo Burbuja.
El bubble sort, tambin conocido como ordenamiento burbuja, consiste en comparar un valor
con el siguiente valor y de acuerdo a la condicin se realizara el intercambio entre los datos, y
este recorrido se va ir haciendo hasta culminar todos los elementos N-1 del arreglo.
Algoritmo:
Desde(g=0 hasta N-1)

// recorrido del vector

Desde (i=0 hasta N-1) //posiciones de comparacin


si(vector[i] > vector[i+1])
aux= vector[i]
vector[i]= vector[i+1]
vector[i+1]=aux
fin_si
fin_desde
fin_desde

Mtodo de Shell.
Nombrado as debido a su inventor Donald Shell. Ordenamiento de disminucin incremental,
Ordena subgrupos de elementos separados K unidades (respecto de su posicin en el arreglo)
del arreglo original. El valor K es llamado incremento.
Despus de que los primeros K subgrupos han sido ordenados (generalmente utilizando
INSERCION DIRECTA), se escoge un nuevo valor de K ms pequeo, y el arreglo es de nuevo
partido entre el nuevo conjunto de subgrupos. Cada uno de los subgrupos mayores es
ordenado y el proceso se repite de nuevo con un valor ms pequeo de K.
Eventualmente el valor de K llega a ser 1, de tal manera que el subgrupo consiste de todo el
arreglo ya casi ordenado.
Al principio del proceso se escoge la secuencia de decrecimiento de incrementos; el ltimo
valor debe ser 1. "Es como hacer un ordenamiento de burbuja pero comparando e
intercambiando elementos."

Tcnica de Programacin Orientada a Objetos

29

Cuando el incremento toma un valor de 1, todos los elementos pasan a formar parte del
subgrupo y se aplica insercin directa.
El mtodo se basa en tomar como salto N/2 (siendo N el nmero de elementos) y luego se va
reduciendo a la mitad en cada repeticin hasta que el salto o distancia vale 1.

Procedimiento Shell Sort;

Procedimiento SHELL(variables Vector:A; entero:n)


variables
entero: aux,i,int
logico: band
Incio
int=n+1;
Mientras (int>1)
int=1mod(int div 2)
band=true
Mientras (band=true )
band=false
i=1
Mientras ((i+int)<=n)
si(a[i] > a[i+int]) entonces
aux=a[i]
a[i]=a[i+int]
a[i+int]=aux
band=true
fin_si
i=i+1
Fin_Mientras
Fin_Mientras
Fin_Mientras
Fin

Ejemplo:
Para el arreglo a = [6, 1, 5, 2, 3, 4, 0]
Tenemos el siguiente recorrido:
Recorrido

Salto

Lista Ordenada Intercambio

2,1,4,0,3,5,6

(6,2), (5,4), (6,0)

0,1,4,2,3,5,6

(2,0)

0,1,4,2,3,5,6

Ninguno

0,1,2,3,4,5,6

(4,2), (4,3)

0,1,2,3,4,5,6

Ninguno

Tcnica de Programacin Orientada a Objetos

30

Ejemplos en cdigo JAVA:


.

void ordenamientoBurbuja(int v[], int util_v) {


int temp;
for (int i = 0; i <= util_v - 2; i++) {
for (int j = i + 1; j <= util_v - 1; j++) {
if (v[i] > v[j]) {
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
}
}
}

void shell_sort(int A[], int size){


int i, j, incrmnt, temp;
incrmnt = size/2;
while (incrmnt > 0) {
for (i=incrmnt; i < size; i++) {
j = i;
temp = A[i];
while ((j >= incrmnt) && (A[j-incrmnt] > temp))
A[j] = A[j - incrmnt];
j = j - incrmnt;
}
A[j] = temp;
}
incrmnt /= 2;
}
}

Tcnica de Programacin Orientada a Objetos

31

Bsqueda
Un algoritmo de bsqueda es aquel que est diseado para localizar un elemento concreto
dentro de una estructura de datos. Consiste en solucionar un problema de existencia o no de
un elemento determinado en un conjunto finito de elementos, es decir, si el elemento en
cuestin pertenece o no a dicho conjunto, adems de su localizacin dentro de ste.
Este problema puede reducirse a devolver la existencia de un nmero en un vector.

Bsqueda secuencial
Permite localizar el dato dentro del arreglo desde la posicin inicial hasta la posicin final, la
existencia se puede asegurar desde el momento que el elemento es localizado (pero no
podemos asegurar la no existencia hasta no haber analizado todos los elementos del arreglo).

Datos de Entrada:
vec: nombre de la coleccin de todos los datos
tam: tamao del vector
dato: elemento que se quiere buscar.

Variables
entero: pos
Inicio
leer(dato)
pos = 0
Mientras(pos < tam)
Si (vec[pos]= dato) entonces
Devolver= verdadero
sino
pos = pos + 1
fin_si
fin_Mientras

Bsqueda binaria
Se utiliza cuando el vector en el que queremos determinar la existencia o no de un elemento
est ordenado, o puede estarlo, este algoritmo reduce el tiempo de bsqueda
considerablemente, ya que disminuye exponencialmente con el nmero de iteraciones.

1ero.- se deber de aplicar un ordenamiento de


datos ya sea ascendeste o descendente.
2do.- aplicar cualquier tcnica de bsqueda.

Tcnica de Programacin Orientada a Objetos

32

Ejemplos
Caso 01
Dentro de una lista de 10 nombres, verifique si el nombre ingresado existe o no y en que
posicion.
public class FrmBus extends JFrame {
final int tam=5;
String nom[]=new String[tam];
int x;
***
***
***
void agregar(){
if(x<tam){
nom[x]=txtnom.getText();
modlstn.addElement((x+1)+".- "+nom[x]);
++x;
txtnom.setText("");
txtnom.requestFocus();
}else{
JOptionPane.showMessageDialog(null,"Ya
nombres\n"+"Termino el Ingreso");
txtnom.setEnabled(false);
}
}

no

se

puede

ingresar

mas

void busqueda(){
int sw=0,posi=0;
String n=JOptionPane.showInputDialog("Ingresar Nombre a buscar");
for(int f=0;f<x;++f){
if(n.equalsIgnoreCase(nom[f])){
sw=0;
posi=f;
break;
}
else
sw=1;
}
if(sw==0){
lblb.setText("El Nombre Encontrado");
lblp.setText(" "+(posi+1));
}
else
lblb.setText("El Nombre No Existe");
}

Tcnica de Programacin Orientada a Objetos

33

private void btnnom_actionPerformed(ActionEvent e) {


agregar();
}
private void btnBuscar_actionPerformed(ActionEvent e) {
busqueda();
}

Tcnica de Programacin Orientada a Objetos

34

Caso 02
Dentro de una lista de 25 distritos muestre si existe o no el distrito de Villa el Salvador.

Caso 03
Crear una Aplicacin donde permita llenar datos a los vectores Nombres, Apellidos Ao de
Nacimiento y edad. Permitir hasta 20 registros.
La edad se calcula de acuerdo al Ao de Nacimiento
El programa permitir :
o Ordenar por Apellido
o Buscar Datos por Nombres y decir cuntos Nombres son iguales.

Se define la dimensin y
los nombres de los
Arreglos

public class FrmEjem01 extends JFrame {


final int filas=20;
String nom[]=new String[filas];
String ape[]=new String[filas];
int edad[]=new int[filas];
int anac[]=new int[filas];

int Reg;

Se define el Contador
del Registro
private void jbInit() throws Exception {
-----------------------------------------------------//llenando el combo con las fechas

Tcnica de Programacin Orientada a Objetos

Se Establece valores
al Combo

35

for(int g=1970;g<=2010;++g)
cboAnac.addItem(g);

void LeerDatos(){
Preguntando si el Registro es
if(Reg<filas){
menor al total de Filas.
nom[Reg]=txtNom.getText();
ape[Reg]=txtApe.getText();
Llena los datos a los Arreglos
}
else
JOptionPane.showMessageDialog(null,"Ya no puede ingresar mas registros");
}
Muestra los datos que tiene el
void llenarRegistros(){
Arreglo
modTbDatos.setValueAt((Reg+1),Reg,0);
modTbDatos.setValueAt(nom[Reg],Reg,1);
modTbDatos.setValueAt(ape[Reg],Reg,2);
modTbDatos.setValueAt(anac[Reg],Reg,3);
Incremento el Registro para
modTbDatos.setValueAt(edad[Reg],Reg,4);
controlar el total de datos
++Reg;
ingresados.
}
private void btnAceptar_actionPerformed(ActionEvent e) {
LeerDatos();
llenarRegistros();
}
private void cboAnac_actionPerformed(ActionEvent e) {
anac[Reg]=Integer.parseInt(cboAnac.getSelectedItem().toString());
edad[Reg]=2010-anac[Reg];
lbledad.setText(""+edad[Reg]);

Calcula la edad segn el ao


seleccionado.

}
void OrdenarB(){
String tempA,tempN;
int tempAn,tempE;
for (int i = 0; i <Reg - 1; i++) {
for (int j = 0; j < Reg - 1; j++) {
if ((ape[j].compareTo(ape[j+1]))>0) {
tempA = ape[j];
ape[j] = ape[j+1];
ape[j+1] = tempA;
//
tempN = nom[j];
nom[j] = nom[j+1];
nom[j+1] = tempN;

Ordenamiento Burbuja.
Por medio del Apellido

El resto de los vectores tambien


deben de realizar solo el
intercambio para seguir el orden.

//
tempAn = anac[j];
anac[j] = anac[j+1];
anac[j+1] = tempAn;

Tcnica de Programacin Orientada a Objetos

36

//
tempE = edad[j];
edad[j] = edad[j+1];
edad[j+1] = tempE;
}
}
}
// visualizar datos ordenados
modTbDatos.setRowCount(15);
for(int g=0;g<Reg;++g){
modTbDatos.setValueAt((g+1),g,0);
modTbDatos.setValueAt(nom[g],g,1);
modTbDatos.setValueAt(ape[g],g,2);
modTbDatos.setValueAt(anac[g],g,3);
modTbDatos.setValueAt(edad[g],g,4);
}

Establecer el total de filas


segn al total de registros.
Mostrar los Datos Ordenados.

}
private void BtnOrdenart_actionPerformed(ActionEvent e) {
modTbDatos.setRowCount(0);
Eliminar todas las filas de la
OrdenarB();
tabla.
}

Llamar al Ordenamiento y
volver a mostrar los datos. Y
se Visualizara en la tabla
ordenado por Apellido.

Para la Busqueda. Deber de aparecer la ventana para buscar el nombre y visualizar si se


encontro y cuantas veces.

Tcnica de Programacin Orientada a Objetos

37

Por lo tanto agrega el metodo busqueda_Nom() y lo llamaremos en el boton Busqueda.

void busqueda_Nom(){
int f=0,c=0;
String Vb=JOptionPane.showInputDialog("Ingresar Nombres a Buscar");
while(f<Reg){
if(Vb.equalsIgnoreCase(nom[f])){
c=c+1;
}
++f;
}
if(c>0)
JOptionPane.showMessageDialog(null,"Nombre Encontrado"+"\n"+"y se Repite
:"+(c)+"Veces");
else
JOptionPane.showMessageDialog(null,"No se Encontrado el Nombre");
}

private void btnBusqueda_actionPerformed(ActionEvent e) {


Tcnica de Programacin Orientada a Objetos

38

busqueda_Nom();
}
Insertar el Botn Eliminar Registro Intenta estableciendo el siguiente cdigo

private void btnEliminar_actionPerformed(ActionEvent e) {


//Fila seleccionada de la Tabla
int FilSelec=jTable1.getSelectedRow();
modTbDatos.removeRow(FilSelec);
nom[FilSelec]="";
ape[FilSelec]="";
edad[FilSelec]=0;
anac[FilSelec]=0;
}

Tcnica de Programacin Orientada a Objetos

39

Contenidos
-

Introduccin a la programacin Orientada a Objetos POO.


Caracteristicas de la programacin orientada a objetos.
Definicin de Clases
Constructores, Estructura de una clase
Nivel de acceso(public, private, protected)
Uso de atributo static.
Interfaces, definicin.
Paquete, distribucin, mencionar la razn de trabajar en capas, manejo de capas
(Lgica y Presentacin )
- Encapsulacin (get y set de los atributos)
- Herencia: extends, Polimorfismo
- Sobrecarga de Mtodos
____________________________________________________________________________

Programacin Orientada a Objetos


Es un paradigma de programacin que usa objetos y sus interacciones, para disear
aplicaciones y programas de ordenador. Est basado en varias tcnicas, incluyendo herencia,
modularidad, polimorfismo y encapsulamiento. Su uso se populariz a principios de la dcada
de 1990. En la actualidad, existe variedad de lenguajes de programacin que soportan la
orientacin a objetos.
Un objeto es en realidad un conjunto de funciones y procedimientos, todos ellos relacionados
con un determinado concepto del mundo real. Los objetos son entidades que combinan estado
(atributo), comportamiento (mtodo) e identidad:

El estado est compuesto de datos, ser uno o varios atributos a los que se habrn
asignado unos valores concretos (datos).
El comportamiento est definido por los procedimientos o mtodos con que puede
operar dicho objeto, es decir, qu operaciones se pueden realizar con l.
La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras
palabras, es su identificador (concepto anlogo al de identificador de una variable o
una constante).

Tcnica de Programacin Orientada a Objetos

40

La programacin orientada a objetos, expresa un programa como un conjunto de estos objetos,


que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y mdulos
ms fciles de escribir, mantener, y reutilizar.
Un objeto contiene toda la informacin que permite definirlo e identificarlo frente a otros objetos
pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener
valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de
interaccin llamados mtodos, que favorecen la comunicacin entre ellos. Esta comunicacin
favorece a su vez el cambio de estado en los propios objetos. Esta caracterstica lleva a
tratarlos como unidades indivisibles, en las que no se separa el estado y el comportamiento.
Los mtodos (comportamiento) y atributos (estado) estn estrechamente relacionados por la
propiedad de conjunto. Esta propiedad destaca que una clase requiere de mtodos para poder
tratar los atributos con los que cuenta. El programador debe pensar indistintamente en ambos
conceptos, sin separar ni darle mayor importancia a alguno de ellos. Hacerlo podra producir el
hbito errneo de crear clases contenedoras de informacin por un lado y clases con mtodos
que manejen a las primeras por el otro. De esta manera se estara realizando una
programacin estructurada camuflada en un lenguaje de programacin orientado a objetos.
La POO difiere de la programacin estructurada tradicional, en la que los datos y los
procedimientos estn separados y sin relacin, ya que lo nico que se busca es el
procesamiento de unos datos de entrada para obtener otros de salida. La programacin
estructurada anima al programador a pensar sobre todo en trminos de procedimientos o
funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan.
En la programacin estructurada slo se escriben funciones que procesan datos. Los
programadores que emplean POO, en cambio, primero definen objetos para luego enviarles
mensajes solicitndoles que realicen sus mtodos por s mismos.

Caractersticas de la POO
Existe un acuerdo acerca de qu caractersticas contempla la "orientacin a objetos", las
caractersticas siguientes son las ms importantes:

Abstraccin: Denota las caractersticas esenciales de un objeto, donde se capturan


sus comportamientos.Cada objeto en el sistema sirve como modelo de un "agente"
abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse"
con otros objetos en el sistema sin revelar cmo se implementan estas caractersticas.
Los procesos, las funciones o los mtodos pueden tambin ser abstrados y cuando lo
estn, una variedad de tcnicas son requeridas para ampliar una abstraccin.

Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse


pertenecientes a una misma entidad, al mismo nivel de abstraccin. Esto permite
aumentar la cohesin de los componentes del sistema. Algunos autores confunden
este concepto con el principio de ocultacin, principalmente porque se suelen emplear
conjuntamente.

Principio de ocultacin: Cada objeto est aislado del exterior, es un mdulo


natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cmo
pueden interactuar con los objetos de la clase. El aislamiento protege a las
propiedades de un objeto contra su modificacin por quien no tenga derecho a acceder
a ellas, solamente los propios mtodos internos del objeto pueden acceder a su estado.
Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de
maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas.
Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del
objeto de una manera controlada y limitando el grado de abstraccin. La aplicacin
entera se reduce a un agregado o rompecabezas de objetos.

Tcnica de Programacin Orientada a Objetos

41

Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden


compartir el mismo nombre, al llamarlos por ese nombre se utilizar el comportamiento
correspondiente al objeto que se est usando. O dicho de otro modo, las referencias y
las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocacin
de un comportamiento en una referencia producir el comportamiento correcto para el
tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecucin", esta
ltima caracterstica se llama asignacin tarda o asignacin dinmica. Algunos
lenguajes proporcionan medios ms estticos (en "tiempo de compilacin") de
polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.

Herencia: las clases no estn aisladas, sino que se relacionan entre s, formando una
jerarqua de clasificacin. Los objetos heredan las propiedades y el comportamiento de
todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y
el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos
especializados de objetos preexistentes. Estos pueden compartir (y extender) su
comportamiento sin tener que volver a implementarlo. Esto suele hacerse
habitualmente agrupando los objetos en clases y estas en rboles o enrejados que
reflejan un comportamiento comn. Cuando un objeto hereda de ms de una clase se
dice que hay herencia mltiple.

Recoleccin de basura: la Recoleccin de basura o Garbage Collector es la tcnica


por la cual el ambiente de Objetos se encarga de destruir automticamente, y por tanto
desasignar de la memoria, los Objetos que hayan quedado sin ninguna referencia a
ellos. Esto significa que el programador no debe preocuparse por la asignacin o
liberacin de memoria, ya que el entorno la asignar al crear un nuevo Objeto y la
liberar cuando nadie lo est usando. En la mayora de los lenguajes hbridos que se
extendieron para soportar el Paradigma de Programacin Orientada a Objetos como
C++ u Object Pascal, esta caracterstica no existe y la memoria debe desasignarse
manualmente.

Clases en POO
Las clases son declaraciones de objetos, tambin se podran definir como abstracciones de
objetos(quiere decir que la definicin de un objeto es la clase). Cuando programamos un objeto
y definimos sus caractersticas y funcionalidades en realidad lo que estamos haciendo es
programar una clase.

Propiedades en clases
Las propiedades o atributos son las caractersticas de los objetos. Cuando definimos una
propiedad normalmente especificamos su nombre y su tipo. Nos podemos hacer a la idea de
que las propiedades son algo as como variables donde almacenamos datos relacionados con
los objetos.

Mtodos en las clases


Son las funcionalidades asociadas a los objetos. Cuando estamos programando las clases las
llamamos mtodos. Los mtodos son como funciones que estn asociadas a un objeto.

Objetos en POO
Los objetos son ejemplares de una clase cualquiera. Cuando creamos un ejemplar tenemos
que especificar la clase a partir de la cual se crear. Esta accin de crear un objeto a partir de
una clase se llama instanciar (que viene de una mala traduccin de la palabra instace que en
ingls significa ejemplar). Por ejemplo, un objeto de la clase fraccin es por ejemplo 3/5. El
concepto o definicin de fraccin sera la clase, pero cuando ya estamos hablando de una
fraccin en concreto 4/7, 8/1000 o cualquier otra, la llamamos objeto.
Para crear un objeto se tiene que escribir una instruccin especial que puede ser distinta
dependiendo el lenguaje de programacin que se emplee, pero ser algo parecido a esto.
miCoche = new Coche()

Tcnica de Programacin Orientada a Objetos

42

Con la palabra new especificamos que se tiene que crear una instancia de la clase que sigue a
continuacin. Dentro de los parntesis podramos colocar parmetros con los que inicializar el
objeto de la clase coche.

Estados en objetos
Cuando tenemos un objeto sus propiedades toman valores. Por ejemplo, cuando tenemos un
coche la propiedad color tomar un valor en concreto, como por ejemplo rojo o gris metalizado.
El valor concreto de una propiedad de un objeto se llama estado.
Para acceder a un estado de un objeto para ver su valor o cambiarlo se utiliza el operador
punto.
miCoche.color = rojo
El objeto es miCoche, luego colocamos el operador punto y por ltimo el nombre e la propiedad
a la que deseamos acceder. En este ejemplo estamos cambiando el valor del estado de la
propiedad del objeto a rojo con una simple asignacin.

Mensajes en objetos
Un mensaje en un objeto es la accin de efectuar una llamada a un mtodo.

Otras cosas
Hay mucho todava que conocer de la POO ya que slo hemos hecho referencia a las cosas
ms bsicas. Tambin existen mecanismos como la herencia y el polimorfismo que son unas
de las posibilidades ms potentes de la POO.
La herencia sirve para crear objetos que incorporen propiedades y mtodos de otros objetos.
As podremos construir unos objetos a partir de otros sin tener que reescribirlo todo.
El polimorfismo sirve para que no tengamos que preocuparnos sobre lo que estamos
trabajando, y abstraernos para definir un cdigo que sea compatible con objetos de varios
tipos.
Son conceptos avanzados que cuesta explicar en las lneas de ese informe. No hay que olvidar
que existen libros enteros dedicados a la POO y aqu solo pretendemos dar un repaso a
algunas cosas para que os suenen cuando tengis que poneros delante de ellas en los
lenguajes de programacin que debe conocer un desarrollador del web.

Tcnica de Programacin Orientada a Objetos

43

Creacin de Clases en JAVA


Crear la aplicacin con su proyecto, luego elegir crea la Class y saldr esta ventana.
Para crear una sub clase (hija), deber de seleccionar
la opcin public estars. Y su estructura quedara as.
public class SubClaseHija1 {
//Cuerpo de la Clase Hija
}

Para crear una clase main (principal), deber de seleccionar la opcin public y generate
Main Method. Y su estructura quedara as.

public class ClassEjecutar {


//Atributos Globales
//Metdos
public static void main(String[] args) {
//referencia de la clase
ClassEjecutar Ejecutar = new ClassEjecutar();
//atributos Locales

}
}
Ejemplo 01: mostrar mis datos personales desde una clase Main.
public class ClassEjecutar1 {
public static void main(String[] args) {
//referencia de la clase
ClassEjecutar1 Ejecutar = new ClassEjecutar1();
String nombres="Veronica Ysabel";
String ape="Escobar Runco";
String espe="Computacion e Informatica";
System.out.println("Nombres: "+nombres);
System.out.println("Apellidos: "+ape);
System.out.println("Especialidad: "+espe);
}
}

Tcnica de Programacin Orientada a Objetos

44

Usando consola

Ejemplo 02: mostrar datos personales ingresado por el usuario desde una clase
Main.
public class ClassEjecutar2 {
public static void main(String[] args) {
//referencia de la clase
ClassEjecutar2 Ejecutar = new ClassEjecutar2();
String nombres=JOptionPane.showInputDialog("Ingresar Nombre");
String ape=JOptionPane.showInputDialog("Ingresar Apellido");
String espe=JOptionPane.showInputDialog("Ingresar Especialidad");
JOptionPane.showMessageDialog(null,"Nombres: "+nombres+"\n"+"Apellidos:"+ape
+"\n" +"Especialidad: "+espe,"Datos Personales",1);
}
}

Usando Message

Tcnica de Programacin Orientada a Objetos

45

Ejemplo 03: ingresar 2 nmeros y mostrar las 4 operaciones bsicas.


public class ClassEjecutar3 {
public static void main(String[] args) {
int num1, num2, sum,res,mul;
double divi;
num1=Integer.parseInt(JOptionPane.showInputDialog("Ingrece el #1"));
num2=Integer.parseInt(JOptionPane.showInputDialog("Ingrece el #2"));
sum=num1+num2;
res=num1-num2;
mul=num1*num2;
divi=num1/num2;
JOptionPane.showMessageDialog(null,"La suma de\t"+num1+"+"+num2+"="+
sum,"Operacin de Suma",2);
JOptionPane.showMessageDialog(null,"La resta de\t"+num1+"-"+num2+"="+
res,"Operacin de Resta",2);
JOptionPane.showMessageDialog(null,"La multiplicacion de\t"+num1+"*"+num2+"="+
mul,"Operacin de Multiplicacin",2);
JOptionPane.showMessageDialog(null,"La Divisin de\t"+num1+"/"+num2+"="+
divi,"Operacin de Divisin",2);
}
}

Tcnica de Programacin Orientada a Objetos

46

Aplicando Herencia entre Clases


Ejemplo 01: ingresar 2 nmeros y mostrar las 4 operaciones bsicas usando
herencia.

Usando clases
public class SubClaseHija1 {
//Metodos
public int Suma(int a,int b){
return(a+b);
}
public int Resta(int a,int b){
return(a-b);
}
public int Multiplica(int a,int b){
return(a*b);
}
public int divi(int a,int b){
return(a/b);
}
}
--------------------------------------------------------------------------------------package prjcaso1;
import javax.swing.JOptionPane;
public class ClassEjecutar extends

SubClaseHija1 {

//Atributos Globales
public static void main(String[] args) {
//referencia de la clase
ClassEjecutar Ejecutar = new ClassEjecutar();
//atributos Locales
int num1, num2;

num1=Integer.parseInt(JOptionPane.showInputDialog("Ingrece el #1"));
num2=Integer.parseInt(JOptionPane.showInputDialog("Ingrece el #2"));
JOptionPane.showMessageDialog(null,"La suma de\t"+num1+"+"+num2+"="+
Ejecutar.Suma(num1,num2),"Operacion de Suma",2);
JOptionPane.showMessageDialog(null,"La resta de\t"+num1+"-"+num2+"="+
Ejecutar.Resta(num1,num2),"Operacion de Resta",2);
JOptionPane.showMessageDialog(null,"La multiplicacion de\t"+num1+"*"+num2+"="+
Ejecutar.Multiplica(num1,num2),"Operacion de Multiplicacin",2);
JOptionPane.showMessageDialog(null,"La Divisin de\t"+num1+"/"+num2+"="+
Ejecutar.divi(num1,num2),"Operacion de Divisin",2);

Tcnica de Programacin Orientada a Objetos

47

Usando Referencias
public class SubClaseHija1 {
//Metodos
public int Suma(int a,int b){
return(a+b);
}
public int Resta(int a,int b){
return(a-b);
}
public int Multiplica(int a,int b){
return(a*b);
}
public int divi(int a,int b){
return(a/b);
}
}
_____________________________________________________________
// La clase Main
public class ClassEjecutar {
//Atributis Globales
public static void main(String[] args) {
//referencia del Frame
FrmOperaciones llamar=new FrmOperaciones();
llamar.setVisible(true);
//atributos Locales

}
}

Tcnica de Programacin Orientada a Objetos

48

Usando formulario para la presentacin de la clase


public class SubClaseHija1 {
//Metodos
public int Suma(int a,int b){
return(a+b);
}
public int Resta(int a,int b){
return(a-b);
}
public int Multiplica(int a,int b){
return(a*b);
}
public int divi(int a,int b){
return(a/b);
}
}

//Diseo del Frame


public class FrmOperaciones extends JFrame {
//Referencia de la SubClase
SubClaseHija1 Ejecutar = new SubClaseHija1();

.
private void btnCalcular_actionPerformed(ActionEvent e) {
int num1, num2;
num1=Integer.parseInt(txta.getText());
num2=Integer.parseInt(txtb.getText());
txtSalida.append("La suma de\t"+num1+"+"+num2+"="+Ejecutar.Suma(num1,num2)+"\n");
txtSalida.append("La resta de\t"+num1+"-"+num2+"="+Ejecutar.Resta(num1,num2)+"\n");
txtSalida.append("La
multiplicacion
de:
"+num1+"*"+num2+"="+Ejecutar.Multiplica(num1,num2)+"\n");
txtSalida.append("La Divisin de\t"+num1+"/"+num2+"="+Ejecutar.divi(num1,num2)+"\n");
}
}

Tcnica de Programacin Orientada a Objetos

49

Los constructores
Un objeto de una clase se crea llamando a una funcin especial denominada constructor de la
clase. El constructor se llama de forma automtica cuando se crea un objeto, para situarlo en
memoria e inicializar los miembros datos declarados en la clase. El constructor tiene el mismo
nombre que la clase. Lo especfico del constructor es que no tiene tipo de retorno.
public class ClassConstructor {
public ClassConstructor() {
System.out.println("Alumno SISE");
}
public ClassConstructor(String Esp) {
System.out.println("Su Especialidad " + Esp);
}
public ClassConstructor(int Costo) {
System.out.println("El Costo " + Costo + " Soles");
}
public ClassConstructor(int Costo,String Esp) {
double de=0,neto;
if(Esp.equalsIgnoreCase("Sistemas"))
de=0.15*Costo;
if(Esp.equalsIgnoreCase("Contabilidad"))
de=0.10*Costo;
neto=Costo-de;
System.out.println("Descuento " + de);
System.out.println("Neto " + neto );
}

Llamando al constructor desde una clase Main


public static void main(String args[]) {
ClassConstructor Alum1 = new ClassConstructor();
String espe=JOptionPane.showInputDialog("Ingresar Especialidad");
int costo=Integer.parseInt(JOptionPane.showInputDialog("Ingresar Costo"));
ClassConstructor Alum2 = new ClassConstructor(espe);
ClassConstructor Alum3 = new ClassConstructor(costo,espe);
}
}

Tcnica de Programacin Orientada a Objetos

50

Calificadores: Public, Private, Protected, Static y Final.


El uso de calificadores de acceso en Java tiene sus bases en el uso de libreras
("packages"), al ser diseado un programa existen diversas funciones/mtodos y variables
dentro de ste, algunas de estas requerirn ser modificadas conforme incrementen las
necesidades del programa, mientras otras permanecern inmviles, la importancia de estos
cambios requiere que sean utilizados calificadores para permitir/negar el acceso a ciertos
segmentos del programa, analicemos el siguiente caso:
Usted ya diseo 300 clases que estn siendo re-utilizadas por otros programas, sin
embargo, se le ha solicitado una modificacin radical a estos objetos base, cuales
mtodos/campos de estas 300 Clases puede modificar sin quebrantar los otros programas
que hacen uso de estas ? Aqu puede surgir un serio problema sino han sido utilizados los
calificadores de acceso acordemente.
Ahora bien, adems de los calificadores de acceso que permiten restringir el uso de
mtodos/campos a determinadas situaciones, tambin existen otros calificadores que
afectan directamente la creacin y uso de instancias por clase estos calificadores son static
yfinal.

public : Acceso libre .


El uso del calificador public significa que toda definicin ser accesible de cualquier punto,
ya sea un mtodo, campo o clase. Su uso implica un acceso global, desde luego el uso de
este calificativo en Clases que sern modificadas constantmente es fuertemente
desalentado, ya que puede quebrantar dependencias forjadas en versiones previas.

private : Solo en la misma Clase .

El calificador private indica que dicho componente ser accesible nicamente dentro de la
Clase en cuestin, si se intenta accesar cualquier elemento de este tipo dentro de otra
Clase ser generado un error de compilacin.
El calificador private suele utilizarse en Clases que sern modificadas continuamente, esto
permite evitar futuros quebrantos en otras Clases como fue mencionado al inicio.

protected : Clases Heredadas y misma Clase.


El uso de protected es utilizado bajo los conceptos de Herencias ("Inheritance"), aunque
este tema ser descrito en otra seccin, mediante protected es posible accesar elementos
de la Clase Hereditaria ("Inherited"), aunque no aquellos que utilicen el calificador private.
En otras palabras, si determinada Clase hijo hereda ("inherit") el comportamiento de una
Clase padre, la Clase hijo tendr acceso a todos aquellos campos/mtodos definidos como
protected en padre, pero no aquellos declarados como private en padre.

Tcnica de Programacin Orientada a Objetos

51

Ningn Calificador : Clase en Librera y misma Clase .


Finalmente, cuando no es empleado ninguno de los calificadores de acceso mencionados
anteriormente los elementos son considerados amigables, esto implica que todo
campo/mtodo carente de calificador ser accesible dentro de todas Clases pertenecientes
a su misma librera("package").

static : Una sola instancia .


El uso del vocablo static ha venido siendo utilizado en los mtodos principales (main) de los
programas escritos anteriormente, su uso esta relacionado directamente al uso de
instancias en Clases; en ocasiones es necesario o conveniente generar elementos que
tomen un mismo valor para cualquier nmero de instancias generadas o bien
invocar/llamar mtodos sin la necesidad de generar instancias, y es bajo estas dos
circunstancias que es empleado el calificador static.
El primer uso de static puede ser poco evidente, pero tomemos el caso de la Clase
mencionada al inicio de este curso de una Lampara, en caso de requerirse un elemento
como un apagador pudiera resultar sobrado generar una instancia para cada Lampara, en
este caso pudiera ser restringido un apagador a una sola instancia mediante el calificador
static permitiendo que dicho elemento sea utilizado por todas las instancias de Lampara ah
generadas; desde luego la descripcin anterior esta trivializada, sin embargo, conforme se
avance en el presente curso sern ilustrados otros ejemplos con este mecanismo.
La segunda situacin para el uso de static puede ser ejemplificada perfectamente a travs
del mtodo main Java, el mtodo main puede ser llamado automticamente al invocarse la
respectiva Clase debido a que no se encuentra asociado con ningn tipo de instancia, esto
implica que su comportamiento siempre ser el mismo independientemente de la instancia
que realza su llamada.
Dos aspectos caractersticos de utilizar el calificador static en un elemento Java son los
siguientes :

No puede ser generada ninguna instancia (Uso de new) de un elemento static puesto que
solo existe una instancia.
Todos los elementos definidos dentro de una estructura static deben ser static ellos mismos
, o bien, poseer una instancia ya definida para poder ser invocados.
NOTA: Lo anterior no implica que no puedan ser generadas instancias dentro de un
elemento static; no es lo mismo llamar/invocar que crear/generar.
La teora del concepto static puede ser un poco difcil de digerir, sin embargo, como fue
mencionado anteriormente, conforme avance el curso sern descritos diversos fragmentos
de cdigo para dejar en claro su uso.

Tcnica de Programacin Orientada a Objetos

52

final : Una sola instancia y definitiva.


El calificador final estrechamente relacionado con el uso de static implica una asignacin
nica y definitiva al elemento de una clase. A diferencia de static que implica una sola
instancia, el termino final lleva dicha instancia a una definicin nica y como su nombre lo
implica final.
Generalmente final es utilizado en aquellos elementos que no sern modificados al
momento de ejecutarse ("Run-Time") un programa o clase , a travs de final se asigna un
valor que no podr ser modificado bajo ninguna circunstancia al momento de ejecucin
("Run-Time), en efecto logrando un nivel de eficiencia en ejecucin.
De igual manera que la utilizacin de static el uso de final ser ilustrado conforme se
avanze en este curso.

Atributo Static
El atributo static, que se puede utilizar con propiedades declaradas con las palabras clave var,
const o function, permite asociar una propiedad a la clase en lugar de asociarla a instancias de
la clase. El cdigo externo a la clase debe llamar a propiedades estticas utilizando el nombre
de la clase en lugar de un nombre de instancia. Las subclases no heredan las propiedades
estticas, pero las propiedades forman parte de una cadena de mbitos de subclase. Esto
significa que en el cuerpo de una subclase se puede utilizar una variable o un mtodo esttico
sin hacer referencia a la clase en la que se defini.

Tcnica de Programacin Orientada a Objetos

53

Interfaces
El concepto de Interface lleva un paso ms adelante la idea de las clases abstractas. En Java
una interface es una clase abstracta pura, es decir una clase donde todos los mtodos son
abstractos (no se implementa ninguno). Permite al diseador de clases establecer la forma de
una clase (nombres de mtodos, listas de argumentos y tipos de retorno, pero no bloques de
cdigo). Una interface puede tambin contener datos miembro, pero estos son siempre static y
final. Una interface sirve para establecer un 'protocolo' entre clases.
Para crear una interface, se utiliza la palabra clave interface en lugar de class. La interface
puede definirse public o sin modificador de acceso, y tiene el mismo significado que para las
clases. Todos los mtodos que declara una interface son siempre public.
Para indicar que una clase implementa los mtodos de una interface se utiliza la palabra clave
implements. El compilador se encargar de verificar que la clase efectivamente declare e
implemente todos los mtodos de la interface. Una clase puede implementar ms de una
interface.

Declaracin y uso
Una interface se declara:
interface nombre_interface {
tipo_retorno nombre_metodo ( lista_argumentos ) ;
...
}
Como Crear la Interface:

Crear una Aplicacin Normal (La Clase y los Frame)


Luego inserte una interface de la siguiente manera, presionando click derecho sobre el
proyecto y seleccionar General y Java Interface

Tcnica de Programacin Orientada a Objetos

54

Por ejemplo:

public interface IntEjemplo01 {


void Ejemplo1();
void Ejemplo2 ();
void Ejemplo3 ();
String mensaje1();
String mensaje2();
}
Y una clase que implementa la interface:

Presione Alt Enter para validar la implementacin y luego presione en el foquito para que
pueda jalar los mtodos de la interface quedando de la siguiente manera.

Tcnica de Programacin Orientada a Objetos

55

Referencias a Interfaces
Es posible crear referencias a interfaces, pero las interfaces no pueden ser instanciadas. Una
referencia a una interface puede ser asignada a cualquier objeto que implemente la interface.
Por ejemplo:
ClassImplementa usoInterface=new ClassImplementa();

Llamando a los mtodos

int v1=Integer.parseInt(txtv1.getText());
int v2=Integer.parseInt(txtv2.getText());
txtsalida.append("Mtodo que calcula la suma de los 2 numeros:"+ usoInterface.Ejemplo1(v1,v2)+ "\n");

txtsalida.append("Mtodo que calcula la divisin de los 2 numeros:"+ usoInterface.Ejemplo2(v1,v2)+"\n");


txtsalida.append("Mtodo que calcula la multiplica de los 2 numeros:"+ usoInterface.Ejemplo3(v1,v2)+"\n");
txtsalida.append("Brinda el mensaje que es el nombre de nuestra institurcin:"+ usoInterface.mensaje1()+"\n");
txtsalida.append("Brinda el mensaje de aos de fundacin :"+ usoInterface.mensaje2()+"\n");

Extensin de interfaces
Las interfaces pueden extender otras interfaces y, a diferencia de las clases, una interface
puede extender ms de una interface. La sintaxis es:
interface nombre_interface extends nombre_interface , . . . {
tipo_retorno nombre_metodo ( lista_argumentos ) ;
...
}

Tcnica de Programacin Orientada a Objetos

56

Los paquetes
Los paquetes son una forma de organizar grupos de clases. Un paquete contiene un
conjunto de clases relacionadas bien por finalidad, por mbito o por herencia.
Los paquetes resuelven el problema del conflicto entre los nombres de las clases. Al
crecer el nmero de clases crece la probabilidad de designar con el mismo nombre a
dos clases diferentes.
Las clases tienen ciertos privilegios de acceso a los miembros dato y a las funciones
miembro de otras clases dentro de un mismo paquete.
En el Entorno Integrado de Desarrollo (IDE) JBuilder de Borland, un proyecto nuevo se crea en
un subdirectorio que tiene el nombre del proyecto. A continuacin, se crea la aplicacin, un
archivo .java que contiene el cdigo de una clase cuyo nombre es el mismo que el del archivo.
Se pueden agregar nuevas clases al proyecto, todas ellas contenidas en archivos .java
situadas en el mismo subdirectorio. La primera sentencia que encontramos en el cdigo fuente
de las distintas clases que forman el proyecto es package o del nombre del paquete.

La palabra reservada import


Para importar clases de un paquete se usa el comando import. Se puede importar una clase
individual
import java.awt.Font;
o bien, se puede importar las clases declaradas pblicas de un paquete completo, utilizando un
arterisco (*) para reemplazar los nombres de clase individuales.
import java.awt.*;

Realicemos esta estructura creando los paquetes correspondientes

Tcnica de Programacin Orientada a Objetos

57

Herencia
La herencia es uno de los conceptos ms cruciales en la POO. La herencia bsicamente
consiste en que una clase puede heredar sus variables y mtodos a varias subclases (la clase
que hereda es llamada superclase o clase padre). Esto significa que una subclase, aparte de
los atributos y mtodos propios, tiene incorporados los atributos y mtodos heredados de la
superclase. De esta manera se crea una jerarqua de herencia.

Por ejemplo, imaginemos que estamos haciendo el anlisis de un Sistema para una tienda
que vende y repara equipos celulares.

En general, podemos tener una gran jerarqua de Clases tal y como vemos en el siguiente
grfico:

Tcnica de Programacin Orientada a Objetos

58

Ejemplos:
Se puede heredar clases propias de Java como por ejemplo:
public class FrmDiseo extends JFrame
public panel pnlDatos extends JPanel
para cada herencia pedira una importacion como por ejemplo
import javax.swing.JFrame;
import javax.swing.JPanel;
y otras propias del usuario.
public class ClassEJemplo1 extedns subClase01
public class ClassEJemplo1 extedns subClase02
Ejemplo:
Empleemos esta estructura de paquetes para poder realizar la siguiente
aplicacin:

Usara interface ya realizada anteriormente, la clase main para llamar al


frame y una subclase que se usara como herencia y poder ser llamada en
el frame mediante la interface.

Tcnica de Programacin Orientada a Objetos

59

Es la subclase: solo tiene un mtodo que emite un mensaje

Otra subclase: que permita implementar el contenido por cada mtodo


que se estableci en la interface
Herencia

Frame: permitir establecer la referencia a la clase que implementa la


interface y la herencia.

Tcnica de Programacin Orientada a Objetos

60

ENCAPSULAMIENTO
El encapsulamiento es la caracterstica de autonoma de la OO. Esta caracterstica permite
generar componentes autnomos de software tomando una parte de funcionalidad y ocultando
los detalles de la implementacin al mundo exterior.
Los trminos mdulo, componente o bean se suelen utilizan en lugar de componente
encapsulado de software.
Una vez encapsulada, una entidad de software se puede visualizar como una caja negra.

Ejemplo:
Declare los atributos que desea encapsular:

Luego presione click derecho


sobre los atributos y elija
REFACTOR luego
ENCAPSULATE FIELDS

Luego presentara esta ventana


donde tendr que seleccionar
todos los atributos que estarn
encapsulados
Tcnica de Programacin Orientada a Objetos

61

Luego se crearan los get y set por cada atributo.

Tcnica de Programacin Orientada a Objetos

62

Sobrecarga
En programacin orientada a objetos la sobrecarga se refiere a la posibilidad de tener dos o
ms funciones con el mismo nombre pero funcionalidad diferente. Es decir, dos o ms
funciones con el mismo nombre realizan acciones diferentes. El compilador usar una u otra
dependiendo de los parmetros usados. A esto se llama tambin sobrecarga de funciones.
Tambin existe la sobrecarga de operadores que al igual que con la sobrecarga de funciones
se le da ms de una implementacin a un operador.
Sobrecarga es la capacidad de un lenguaje de programacin, que permite nombrar con el
mismo identificador diferentes variables u operaciones
El mismo mtodo dentro de una clase permite hacer cosas distintas en funcin de los
parmetros
Java no permite al programador implementar sus propios operadores sobrecargados, pero s
utilizar los predefinidos como el + del ejemplo anterior. C++, por el contrario si permite
hacerlo.

Sobrecarga de Mtodos y de Constructores


La firma de un mtodo es la combinacin del tipo de dato que regresa, su nombre y su lista de
argumentos.
La sobrecarga de mtodos es la creacin de varios mtodos con el mismo nombre pero con
diferentes firmas y definiciones. Java utiliza el nmero y tipo de argumentos para seleccionar
cul definicin de mtodo ejecutar.
Java diferencia los mtodos sobrecargados con base en el nmero y tipo de argumentos que
tiene el mtodo y no por el tipo que devuelve.
Tambin existe la sobrecarga de constructores: Cuando en una clase existen constructores
mltiples, se dice que hay sobrecarga de constructores.
Algunos mtodos en una clase pueden tener el mismo nombre. Estos mtodos deben contar
con diferentes argumentos. El compilador decide qu mtodo invocar comparando los
argumentos. Se generara un error si los mtodos slo varan en el tipo de retorno.

Tcnica de Programacin Orientada a Objetos

63

Ejemplos
Caso 01
Crear una sobrecarga que permita sumar 2 nmeros y ser llamado de acuerdo al tipo
de dato que se le envie.
public class ClassSobreCalculos {
public int Totales(int a,int b){
return(a+b);
}
public double Totales(double a, double b){
return(a+b);
}
public long Totales(long a, long b){
return(a+b);
}
}

Caso 02
Crear una sobrecarga de mtodos donde permita hallar el sueldo, descuento y el neto.
El sueldo depender del costo y cantidad de horas
El descuento segn el estado de Honorarios o Planilla
Neto segn el sueldo y el descuento.
package pckLogico;
public class ClassSobre {
public double Calcular(int ch,int costo){
return(ch*costo);
}
public double Calcular(int sueld, String estado){
double de=0;
if(estado.equalsIgnoreCase("Planilla"))
de=0.12*sueld;
if(estado.equalsIgnoreCase("Honorarios"))
de=0.07*sueld;
return(de);
}
public double Calcular(int sueld,double de){
return(sueld-de);
}
}
Package pckLogico;
public class ClassEncapsular {

Tcnica de Programacin Orientada a Objetos

64

int sueldo,costo,ch;
double desc,neto;
String estado;
public int getSueldo() { return sueldo; }
public void setSueldo(int sueldo) {
this.sueldo = sueldo; }
public int getCosto() {
return costo; }
public void setCosto(int costo) {
this.costo = costo; }
public int getCh() {
return ch; }
public void setCh(int ch) {
this.ch = ch; }
public double getDesc() {
return desc; }
public void setDesc(double desc) {
this.desc = desc; }
public double getNeto() {
return neto; }
public void setNeto(double neto) {
this.neto = neto; }
public String getEstado() {
return estado; }
public void setEstado(String estado) {
this.estado = estado;
}

Llamando las clases Encapsulada y sobrecarga en el JFRAME


package pclPrincipal;

public class FrmDatos extends JFrame {


ClassSobre metodos=new ClassSobre();
ClassEncapsular atri=new ClassEncapsular();
private void btnAceptar_actionPerformed(ActionEvent e) {
atri.setCh(Integer.parseInt(txtch.getText()));
atri.setCosto(Integer.parseInt(txtcosto.getText()));
atri.setSueldo(metodos.Calcular(atri.getCh(),atri.getCosto()));
lblSuel.setText(""+atri.getSueldo());
atri.setDesc(metodos.Calcular(atri.getSueldo(),atri.getEstado()));
atri.setNeto(metodos.Calcular(atri.getSueldo(),atri.getDesc())) ;
lblDes.setText(""+atri.getDesc());
lblN.setText(""+atri.getNeto());
Object valores[]={c,atri.getCh(),atri.getCosto(),atri.getSueldo(),atri.getDesc(),atri.getEstado(),
atri.getNeto()};
ModDatos.addRow(valores);
++c; // contador de registros
}
private void rbtPla_actionPerformed(ActionEvent e) {
atri.setEstado("Planilla");
}
private void rbtHo_actionPerformed(ActionEvent e) {
atri.setEstado("Honorarios");
}
}

Tcnica de Programacin Orientada a Objetos

65

Caso 03
Crear una sobrecarga de mtodos donde permita hallar el sueldo, descuento y el neto.
El sueldo depender del costo y cantidad de horas
El descuento ser del 10% si el sueldo supera a los 1500
Neto segn el sueldo y el descuento.

public class ClassMetodos extends ClassEncapsular{


public int pago(int ch,int cst){
return(ch*cst);
}
public double pago(int sueldo){
double d=0;
if(sueldo>1500)
d=0.10*sueldo;
return(d);
}
public double pago(int sueldo,double dsct){
return(sueldo-dsct);
}
}

//Campos encapsulado
public class ClassEncapsular {
int c,cs,suel;
double np,des;
public int getC() {
return c;
}
public void setC(int c) {
this.c = c;
}
public int getCs() {
return cs;
}
public void setCs(int cs) {
this.cs = cs;
}
public int getSuel() {
return suel;
}
public void setSuel(int suel) {
this.suel = suel;
}
public double getNp() {
return np;
}
public void setNp(double np) {
this.np = np;
}
public double getDes() {
return des;

Tcnica de Programacin Orientada a Objetos

66

}
public void setDes(double des) {
this.des = des;
}
}

// Frame:
public class FrmVentana extends JFrame {
Class1 x = new Class1();
*****
public FrmVentana() {
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
*******
******
******
}
private void btnCalcular_actionPerformed(ActionEvent e) {
x.setC(Integer.parseInt(txtch.getText()));
x.setCs(Integer.parseInt(txtcst.getText()));
x.setSuel(x.pago(x.getC(),x.getCs()));
x.setDes(x.pago(x.getSuel()));
x.setNp(x.pago(x.getSuel(),x.getDes()));
lblSueldo.setText(""+x.getSuel());
lblDesc.setText(""+x.getDes());
lblnp.setText(""+x.getNp());
}
private void btnLlamar_actionPerformed(ActionEvent e) {
FrmResultados j=new FrmResultados();
j.setVisible(true);
j.lblr.setText(""+x.getNp());
}
}

// Clase Main
public class Class1 extends ClassMetodos{
public static void main(String[] args) {
FrmVentana ven=new FrmVentana();
ven.setVisible(true);
}

Tcnica de Programacin Orientada a Objetos

67

Caso 04
Crear una sobrecarga de mtodos donde permita hallar el precio, total, igv y el neto.
Segn el articulo saldr el precio. El total ser deacuerdo a la cantidad y precio y el neto ser
deacuero al total y a la seleccin del Igv.

// Clase encapsulada
package pckLogico;
public class ClassEncapsular {
int precio,cantidad;
double total,igv;
String articulo;
public int getPrecio() {

Tcnica de Programacin Orientada a Objetos

68

return precio;
}
public void setPrecio(int precio) {
this.precio = precio;
}
public int getCantidad() {
return cantidad;
}
public void setCantidad(int cantidad) {
this.cantidad = cantidad;
}
public String getArticulo() {
return articulo;
}
public void setArticulo(String articulo) {
this.articulo = articulo;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public double getIgv() {
return igv;
}
public void setIgv(double igv) {
this.igv = igv;
}
}

// clase sobrecarga
package pckLogico;
public class ClassSobreCarga {
public int Calcular(String articulo){
int pre = 0;
if(articulo.equalsIgnoreCase("Monitor"))
pre=259;
if(articulo.equalsIgnoreCase("Teclado"))
pre=15;
if(articulo.equalsIgnoreCase("Memorias"))
pre=175;
if(articulo.equalsIgnoreCase("Case"))

Tcnica de Programacin Orientada a Objetos

69

pre=550;
if(articulo.equalsIgnoreCase("Lectora"))
pre=25;
return(pre);
}
public double Calcular(int cantidad, int precio){
return(cantidad*precio);
}
public double calcular(double total){
return(total*0.19);
}
public double calcular(double total,double igv){
return(total+igv);
}
}

//Frame
public class FrmDatos extends JFrame {
ClassEncapsular atributo = new ClassEncapsular();
ClassSobreCarga metodos = new ClassSobreCarga();
String Titulos[]={"registro","articulo","precio","cantidad","total"};
String valores[][]={};
int c=1;
*************
***************
private void jbInit() throws Exception {
*********************
*********************
*********************
cboArticulo.addItem("Seleccionar");
cboArticulo.addItem("Monitor");
cboArticulo.addItem("Teclado");
cboArticulo.addItem("Memorias");
cboArticulo.addItem("Case");
cboArticulo.addItem("Lectora");
}
private void cboArticulo_actionPerformed(ActionEvent e) {
lblTotal.setText("");
txtCantidad.setText("");
atributo.setArticulo(cboArticulo.getSelectedItem().toString());
lblPrecio.setText(""+metodos.Calcular(atributo.getArticulo()));
atributo.setPrecio(metodos.Calcular(atributo.getArticulo()));
lblPrecio.setText(""+atributo.getPrecio());
}
private void btnAgregar_actionPerformed(ActionEvent e) {
atributo.setCantidad(Integer.parseInt(txtCantidad.getText()));
atributo.setPrecio(atributo.getPrecio());
atributo.setTotal(metodos.Calcular(atributo.getCantidad(),atributo.getPrecio()));
lblTotal.setText(""+atributo.getTotal());

Tcnica de Programacin Orientada a Objetos

70

if(chkIGV.isSelected())
atributo.setIgv(metodos.calcular(atributo.getTotal()));
else
atributo.setIgv(0);
lblIGV.setText(""+atributo.getIgv());
lblneto.setText(""+metodos.calcular(atributo.getTotal(),atributo.getIgv()));
Object
valores[]={c,atributo.getArticulo(),atributo.getPrecio(),atributo.getCantidad(),atributo.getTotal()};
ModDatos.addRow(valores);
++c;
}

private void btnLimpiar_actionPerformed(ActionEvent e) {


txtCantidad.setText("");
cboArticulo.setSelectedIndex(0);
lblIGV.setText("");
lblneto.setText("");
lblPrecio.setText("");
lblTotal.setText("");
}
}

Tcnica de Programacin Orientada a Objetos

71

Contenidos
-

Manejo de Paneles(JPanel)
Clase GregorianCalendar
Clase String: Uso de la Clase String String.valueOf(), length(), charAt(), toString(),
substring(), indexOf(), lastIndexOf(), equalsIgnoreCase(), compareTo(),
- Uso de la Clase String: concat(), replace(), toLowerCase(), toUperCase().
____________________________________________________________________________

PANEL
Construir directamente programas o aplicaciones directamente en un FRAME, produce
rpidamente un amontonamiento de controles o componentes en la propia forma.
Es ms conveniente usar componentes de agrupamiento visuales que faciliten la separacin
fsica y lgica de las diversas partes que componen un programa o aplicacin.
Estos controles de agrupamiento son conocidos como paneles, aunque en visual basic se
conocen como frames (no confundirlos con frame de java).
Java tiene los siguientes tipos de paneles, PANEL, SPLITPANE, SCROLLPANE,
TABBEDPANE, TOOLBAR.
Recordar adems que los panels pueden y deben usar su propio layout para acomodar los
componentes visuales que contendr.
En particular frame usando su layout acomoda sus paneles y panel usando su layout acomoda
los componentes.

El panel es un rea de Java Desktop System en la que se pueden ejecutar aplicaciones y


realizar otras tareas.
La clase Panel es el ms simple de los Contenedores de Componentes grficos. En realidad,
se trataba de crear una clase no-abstracta (Container s lo es) que sirviera de base a los applet
y a otras pequeas aplicaciones. La clase Panel consta de dos mtodos propios: el constructor,
cuyo fin es crear un nuevo Panel con un LayoutManager de tipo FlowLayout (el de defecto), y
el mtodo addNotify() que, sobrecargando la funcin del mismo nombre en la clase Container,
llama al mtodo createPanel() del Toolkit adecuado, creando as un PanelPeer. El AWT
enviar as al Panel (y por tanto al applet) todos los eventos que sobre l ocurran. Esto que

Tcnica de Programacin Orientada a Objetos

72

puede parecer un poco rebuscado, obedece al esquema arquitectnico del AWT; se trata del
bien conocido esquema de separacin interface/implementacin que establece por un lado una
clase de interface y por otras distintas clases de implementacin para cada una de las
plataformas elegidas.

Tcnica de Programacin Orientada a Objetos

73

GregorianCalendar
Segn la documentacin del API de java, la clase Calendar es una clase abstracta base para
convertir entre un objeto de tipo Date (java.util.Date) y un conjunto de campos enteros como
YEAR (ao), MONTH (mes), DAY (da), HOUR (hora), etc.
Una subclase de Calendar representa una fecha de acuerdo a las reglas de un calendario
especfico. La plataforma provee una subclase concreta de Calendar: GregorianCalendar.
Futuras subclases podran representar varios tipos de calendarios lunares usados en diferentes
lugares del mundo.
La clase Calendar tiene mucho del comportamiento que esperaramos de la clase
java.util.Date, es decir, cuando obtenemos una instancia de la clase Calendar obtenemos un
instante de tiempo especfico con gran precisin similar a lo que obtenemos con la clase date.
S es cierto, podemos decir aqu que los milisegundos juegan un papel fundamental en esta
clase; pero el verdadero sentido de la clase Calendar no es obtener un instante de tiempo sino
extraerle
datos.
Recordemos que la clase java.util.Date tiene mtodos que permiten obtener el ao, mes y da,
pero estos mtodos estn obsoletos precisamente por que para eso existe Calendar y de
hecho cuando usamos el mtodo getYear() de la clase java.util.Date esta recurre a las
funcionalidades que posee la clase Calendar.

Hay que mencionar tambin que obtener un instante de tiempo especfico y diferente del actual
es supremamente sencillo con esta clase, indicndole simplemente el da, mes y ao con que
se desea trabajar, o se puede especificar an ms dando hora, minuto y segundo deseado.
Veamos:
El mtodo getInstance() de la clase nos devuelve una subclase de Calendar con el tiempo
ajustado a la hora actual, y usamos el mtodo set(args) para forzarlo a tomar la fecha
deseada:
Calendar ahoraCal = Calendar.getInstance();
System.out.println(ahoraCal.getClass());
ahoraCal.set(2004,1,7);
System.out.println(ahoraCal.getTime());
ahoraCal.set(2004,1,7,7,0,0);
System.out.println(ahoraCal.getTime());

Extraer los datos


La clase Calendar tiene un nico mtodo get para obtener todos sus datos para lo cual se
ayuda de una serie de atributos constantes que permiten obtener o ajustar un atributo
determinado de la fecha; los ms importantes son (al lado los valores que representan):

YEAR: Ao.
MONTH: Mes.
DATE, DAY_OF_MONTH: Da del mes.
DAY_OF_WEEK: Da de la semana entre 1 (MONDAY) y 7 (SATURDAY).
HOUR: Hora antes o despus del medio da (en intervalos de 12 horas).
HOUR_OF_DAY: Lo hora absoluta del da (en intervalos de 24 horas).
MINUTE: El minuto dentro de la hora.
SECOND: El segundo dentro del minuto.

Estn tambin los atributos que representan los meses, como: JANUARY, MARCH, JUNE,
DECEMBER, etc. que van desde 0 (JANUARY) hasta 11 (DECEMBER).

Tcnica de Programacin Orientada a Objetos

74

Tambin hay atributos que representan los das: SUNDAY, TUESDAY, SATURDAY, etc. estos
empiezan con 1 (SUNDAY) y van hasta 7 (SATURDAY).

Hay ms atributos pero con estos es suficiente para los objetivos de este artculo, si deseas
conocerlos todos recurre a la documentacin del lenguaje.

Para extraer algn atributo se usa el mtodo get pasndole como parmetro alguna de las
constantes que vimos anteriormente y el mtodo devuelve siempre un dato de tipo int; as para
obtener el ao, mes, da y hora, usaramos el siguiente cdigo:
System.out.println("ANYO: "+ahoraCal.get(Calendar.YEAR));
System.out.println("MES: "+ahoraCal.get(Calendar.MONTH));
System.out.println("DIA: "+ahoraCal.get(Calendar.DATE));
System.out.println("HORA: "+ahoraCal.get(Calendar.HOUR));
if (ahoraCal.get(Calendar.MONTH) == Calendar.JUNE){
System.out.println("ES JUNIO");
}else{
System.out.println("NO ES JUNIO");
}
Si el objeto tiene la fecha equivalente a 5:30 p.m. del 22 de junio de 2004 se ve la siguiente
salida:
AO:2010
MES:Mayo
DIA:02
HORA:5
ES JUNIO

Modificar Un Atributo
Modificar un atributo de Calendar es tan sencillo como obtenerlo, solamente es necesario usar
el mtodo set(int atributo, int valor), en donde atributo es una de las constante mencionadas
anteriormente y valor es la cantidad que se le quiere asignar. Por ejemplo:
ahoraCal.set(Calendar.MONTH,Calendar.JANUARY) o ahoraCal.set(Calendar.YEAR, 1980)
ajustaran la fecha almacenada en el objeto ahoraCal a enero o al ao 1980 sin modificar
ninguno de los otros atributos.

Aclaremos esto con un ejemplo. Mi cumpleaos es en octubre 27 :-), y deseo saber qu da lo


celebrar en el 2010; para eso obtengo una instancia de Calendar (que siempre devuelve un
objeto del tipo GregorianCalendar) y la ajusto hasta el 27 de octubre de 2010, luego obtengo el
nombre del da, veamos:
Calendar cumpleCal = Calendar.getInstance();
cumpleCal.set(2010,9,27); //La hora no me interesa y recuerda que los meses van de 0 a 11
int dia = cumpleCal.get(Calendar.DAY_OF_WEEK);
System.out.println(dia); //Da 4 = WEDNESDAY = MIRCOLES
La salida es: 4, lo que quiere decir que en el 2010 el 27 de octubre ser un da mircoles (as
que probablemente lo celebre el viernes 29 :-));

Tcnica de Programacin Orientada a Objetos

75

Clase GregorianCalendar y operaciones


Realizar operaciones como sumar o restar das no es algo que dependa directamente de
Calendar sino ms bien de una subclase de esta que implemente algn tipo de calendario
usado, pues no todos los calendarios tienen 12 meses ni aos de 365 das como el que
nosotros (en casi todo occidente) usamos.

Este calendario usado en occidente, llamado gregoriano fue adoptado por primera vez en 1582
por el imperio romano (o aproximadamente) y posteriormente se fue adoptando en muchos
otros pases, por ejemplo 1752 en Gran Bretaa y 1918 en Rusia.
A grandes rasgos sabemos que el calendario gregoriano consta de aos que son definidos por
cada traslacin (vuelta de la tierra alrededor del sol), cada ao tiene doce meses de los cuales
7 tienen 31 das, 4 tienen 30 das y 1 tiene 28 das excepto en aos bisiestos que tiene 29.
Estos aos bisiestos se implantaron para corregir el desfase que tenemos cada cuatro aos (un
ao real dura 365 das y 6 horas aproximadamente), regla completa para los aos bisiestos
segn el calendario gregoriano es la siguiente:

"Un ao es bisiesto si es divisible por 4, a menos que sea divisible por 100 y no por 400".

Todo esto quiz suene un poco tonto, pero es absolutamente necesario tenerlo claro para
entender el funcionamiento de la clase GregorianCalendar.

GregorianCalendar es una subclase de Calendar y es la implementacin directa del calendario


gregoriano (de hecho es la nica implementacin de un calendario en jdk1.4) tal y como lo
conocemos hoy da. Es con esta clase con la que podemos sumar 2 3 das a una fecha sin
preocuparnos por desbordamientos o recalcular meses o aos, pues ella lo hace
automticamente tomando en cuenta las reglas en los prrafos anteriores.
De igual forma podemos obtener informacin como el da de la semana o la semana del ao
que fue una fecha determinada.
Los mtodos roll() y add()
Anteriormente vimos los mtodos set() y get() de la clase Calendar para obtener fechas y los
datos de esas fechas, ahora veremos los mtodos add() y roll() que nos permiten avanzar un
tiempo exacto sobre los datos obtenidos anteriormente.

El mtodo add(CONSTATE, valor) suma algebraicamente valor a una fecha; el valor a sumar
asume el significado dado por CONSTANTE, que es una de las definidas para la clase y que se
mencionaron en la seccin anterior (MONTH, YEAR, SECOND, etc).

Por ejemplo agreguemos 3 das y 2 meses a la fecha actual:


Calendar hoy = Calendar.getInstance();
hoy.add(Calendar.DATE, 3);
hoy.add(Calendar.MONTH, 2);
System.out.println(hoy.getTime());
Ahora restemos 5 aos y 50 das (Prebalo en tu PC):
Calendar hoy = Calendar.getInstance();

Tcnica de Programacin Orientada a Objetos

76

hoy.add(Calendar.YEAR, -5);
hoy.add(Calendar.DATE, -50);
System.out.println(hoy.getTime());

Tcnica de Programacin Orientada a Objetos

77

Clase String
Java posee gran capacidad para el manejo de cadenas dentro de sus clases String y
StringBuffer. Un objeto String representa una cadena alfanumrica de un valor constante que
no puede ser cambiada despus de haber sido creada. Un objeto StringBuffer representa una
cadena cuyo tamao puede variar.
Los Strings son objetos constantes y por lo tanto muy baratos para el sistema. La mayora de
las funciones relacionadas con cadenas esperan valores String como argumentos y devuelven
valores String.
Hay que tener en cuenta que las funciones estticas no consumen memoria del objeto, con lo
cual es ms conveniente usar Character que char. No obstante, char se usa, por ejemplo, para
leer ficheros que estn escritos desde otro lenguaje.

MTODOS PRINCIPALES:
Para poder aplicar estos mtodos es necesario crear un objeto String. Adems de estos
mtodos, la clase String cuenta con otros muchos.

int length(): devuelve la longitud de la String, incluyendo espacios en blanco.


La longitud siempre es una unidad mayor que el ndice asociado al ltimo
carcter de la String.
Ejemplo:

String s=SISE tiene 27 aos..!;

int longitud=str.length();

int indexOf(String str, int indice): devuelve el ndice en el que aparece por
primera vez la String del primer argumento en la que se aplica el mtodo, a
partir del ndice especificado en el segundo argumento. Recordar que una
String est indexada. Si el ndice a partir del que se inicia la bsqueda no
existe o la String no aparece, devuelve -1. MUY USADO.
Ejemplo:

String s=Sebastian Aquino;


Cad=s.indexOf(t,s.length());

int indexOf(char ch): devuelve el ndice en el que aparece por primera vez el
carcter que se le pasa al argumento. Si no se encuentra el carcter devuelve 1. Se observa que el nombre de este mtodo es igual al anterior aunque su
nmero de argumentos es distinto adems de su tipo. A esto, en Java, se le
llama sobrecarga de mtodos: mismo nombre pero distinto n de
argumentos o distinto tipo de argumentos o distinto orden. Ir a la API para
Tcnica de Programacin Orientada a Objetos

78

comprobar que hay ms con este mismo nombre. Este concepto se tratar ms
en profundidad en temas posteriores.
String s=Laboratorios SIse ;
Cad=s.indexOf(S);

String replace (char viejoChar, char nuevoChar): cambia el carcter


asociado al primer argumento por el que se le pasa al segundo, de la String
sobre la que se aplica el mtodo generando una nueva. La String sobre la que
se aplica el mtodo no cambia, simplemente se crea otra nueva en base a la
String sobre la que se aplica el mtodo.
Ejemplo:

String s1=Angie;
Cad=s.replace(e,E);

String toLowerCase(): devuelve una nueva String convirtiendo todos los caracteres
de la String sobre la que se aplica el mtodo, en minsculas.
String s=SEBASTIAN;
JOptionPane.showMessageDialog(null,s.toLowerCase());

String toUpperCase(): devuelve una nueva String convirtiendo todos los caracteres
de la String sobre la que se aplica el mtodo, en maysculas.
String s=william;
JOptionPane.showMessageDialog(null,s.toUpperCase());

boolean equals(String str): investiga si dos String tienen los mismos caracteres y en
el mismo orden. Si es as devuelve true y si no false. MUY USADO
boolean equalsIgnoreCase(String str): investiga si dos String tienen los mismos
caracteres y en el mismo orden sin tener en cuenta las maysculas. Si es as devuelve
true y si no false. MUY USADO
boolean startsWith(String str): devuelve true si la String sobre la que se aplica
comienza por la del argumento; false si esto no ocurre.
boolean startsWith(String str, int indice): devuelve true si la String sobre la que se
aplica comienza por la del argumento a partir de un determinado ndice asociado al
segundo argumento; false si esto no ocurre.

Tcnica de Programacin Orientada a Objetos

79

boolean endsWith(String str): devuelve true si la String sobre la que se aplica acaba
en la del argumento; false si esto no ocurre.
String trim(): devuelve una String en base a la que se le pasa al argumento, pero sin
espacios en blanco al principio ni al final. No elimina los espacios en blanco situados
entre las palabras.
Ejemplo:

String s= Hola William ;


//primero visualicemos la longitud
Int l=s.length();
JOptionPane.showMessageDialog(null,I)
//quitemos el espacio en blanco
Cad=s.trim();
//vuelve a mostrar la longitud
Int l=s.length();
JOptionPane.showMessageDialog(null,I)

String substring(int indiceIni, int indiceFin): devuelve una String obtenida a partir
del ndice inicial incluido y del ndice final excluido; es decir, se comporta como un
intervalo semiabierto [indiceIni, indiceFin). Si el ndice final sobrepasa la longitud de la
String, lanza una IndexOutOfBoundsException. MUY USADO.
Ejemplo:

String s=Docentes de Programacion;


Cad=s.substring(4,9);

char charAt (int indice): devuelve el carcter asociado al ndice que se le pasa como
argumento de la String sobre la que se aplica el mtodo. Si el ndice no existe se lanza
una StringIndexOutOfBoundsException que hereda de IndexOutOfBoundsException.
MUY USADO.

Tcnica de Programacin Orientada a Objetos

80

Contenidos
-

Clase String: Definicin de Archivos


Archivos de Textos: Lectura / Escritura.
Aplicar la capa de Datos con Manejo de Archivos.
Manejo de Excepciones y try catch,
Manejo de las clases BufferedReader, BufferedWriter, PrintWriter, FileReader,
readLine, StringTokenizer, nextToken.
- Apertura de Archivos, Grabar Datos a un archivo.
____________________________________________________________________________

Definicin de ARCHIVOS.
Los archivos tambin denominados ficheros (file); es una coleccin de informacin (datos
relacionados entre s), localizada o almacenada como una unidad en alguna parte de la
computadora.
Los archivos son el conjunto organizado de informaciones del mismo tipo, que pueden utilizarse
en un mismo tratamiento; como soporte material de estas informaciones.

Introduccin a los archivos.

Los archivos como coleccin de datos sirve para la entrada y salida a la computadora y son
manejados con programas.
Los archivos pueden ser contrastados con Arrays y registros; Lo que resulta dinmico y por
esto en un registro se deben especificar los campos, l nmero de elementos de un arrays (o
arreglo), el nmero de caracteres en una cadena; por esto se denotan como "Estructuras
Estticas".
En los archivos no se requiere de un tamao predeterminado; esto significa que se pueden
hacer archivos de datos ms grandes o pequeos, segn se necesiten.

Tcnica de Programacin Orientada a Objetos

81

Cada archivo es referenciado por su identificador (su nombre).

Caractersticas de los Archivos


Independencia de las informaciones respecto de los programas
La informacin almacenada es permanente
Un archivo puede ser accedido por distintos programas en distintos momentos
Gran capacidad de almacenamiento.

Clasificacin de los Archivos


Los archivos se clasifican segn su uso en tres grupos:
Permanentes o Maestros:
Estos contienen informacin que varia poco. En algunos casos es preciso
actualizarlos peridicamente.
De Movimientos
Se cercan para actualizar los archivos maestros. Sus registros son de tres
tipos: alta, bajas y modificaciones.
De Maniobra o Trabajo.
Tienen una vida limitada, normalmente menor que la duracin de la ejecucin de un programa.
Su utilizan como auxiliares de los anteriores.

Tipos De Archivos

Los elementos de un archivo pueden ser de cualquier tipo, simples o estructurados o segn su
funcin.

Segn su funcin.

Se define por:
a.- Archivos Permanentes: Son aquellos cuyos registros sufren pocas o ninguna variacin a lo
largo del tiempo, se dividen en:
Constantes: Estn formados por registros que contienen campos fijos y campos de baja
frecuencia de variacin en el tiempo.
De Situacin: Son los que en cada momento contienen informacin actualizada.
Histricos: Contienen informacin acumulada a lo largo del tiempo de archivos que han
sufridos procesos de actualizacin o bien acumulan datos de variacin peridica en el tiempo.
b.- Archivos de Movimiento: Son aquellos que se utilizan conjuntamente con los maestros
(constantes), y contienen algn campo comn en sus registros con aquellos, para el
procesamiento de las modificaciones experimentados por los mismos.
c.- Archivo de Maniobra o Transitorio: Son los archivos creados auxiliares creados durante
la ejecucin del programa y borrados habitualmente al terminar el mismo.

Segn sus elementos.

Archivo de Entrada: Una coleccin de datos localizados en un dispositivo de entrada.

Tcnica de Programacin Orientada a Objetos

82

Archivo de Salida: Una coleccin de informacin visualizada por la computadora.


Constantes: estn formados por registros que contienen campos fijos y campos de baja
frecuencia de variacin en el tiempo.
De Situacin: son los que en cada momento contienen informacin actualizada.
Histricos: Contienen informacin acumulada a lo largo del tiempo de archivos que han sufrido
procesos de actualizacin, o bien acumulan datos de variacin peridica en el tiempo.

Archivos de Movimiento o Transacciones: Son aquellos que se utilizan


conjuntamente con los maestros (constantes), y contienen algn campo comn en sus
registros con aquellos, para el procesamiento de las modificaciones experimentados
por los mismos.
Archivos de Maniobra o Transitorios: Son los archivos auxiliares creados durante la
ejecucin del programa y borrados habitualmente al terminar el mismo.

Acceso a los Archivos


Se refiere al mtodo utilizado para acceder a los registros de un archivo prescindiendo de su
organizacin. Existen distintas formas de acceder a los datos:
Secuenciales; los registros se leen desde el principio hasta el final del archivo, de tal forma
que para leer un registro se leen todos los que preceden.
Directo; cada registro puede leerse / escribirse de forma directa solo con expresar su direccin
en el fichero por l numero relativo del registro o por transformaciones de la clave de registro
en l numero relativo del registro a acceder.
Por ndice; se accede indirectamente a los registros por su clave, mediante consulta
secuenciales a una tabla que contiene la clave y la direccin relativa de cada registro, y
posterior acceso directo al registro.
Dinmico; es cuando se accede a los archivos en cualquier de los modos anteriormente
citados.
La eleccin del mtodo est directamente relacionada con la estructura de los registros del
archivo y del soporte utilizado.

Tipos de accesos
Acceso Secuencial. Exige el tratamiento de elemento, para esto es necesario una exploracin
secuencial comenzando desde el primer momento (Pascal permite este acceso)
Secuenciales: archivo de texto que debe ser ledo del principio hasta el final.
Acceso Directo. Permite procesar o acceder a un elemento determinado y referencia
directamente por su posicin en el soporte de almacenamiento (Turbo Pascal permite este
acceso.
Aleatorios: Es un archivo con registros de un mismo largo. Un programa puede accesar
directamente cualquier registro sin tener que leer los registros previos.
Binarios: Es un archivo que lee byte por byte sin asumir ninguna estructura.
Los archivos Binarios no son un nuevo tipo de archivo, pero si una nueva forma de manipular
cualquier tipo de archivo. Las tcnicas de archivo binarios permiten leer o cambiar cualquier
byte de un archivo. Son herramientas extremadamente potentes, pero como toda herramienta
potente debe manejarse con cuidado

Operaciones generales que se realizan sobre un archivo.


Tcnica de Programacin Orientada a Objetos

83

Las operaciones generales que se realizan son:


Creacin. Escritura de todos sus registros.
Consulta. Lectura de todos sus registros.
Actualizacin. Insercin supresin o modificacin de algunos de sus registros
Clasificacin. Reubicacin de los registros de tal forma que queden ordenados segn
determinados criterios.
Borrado. Eliminando total del archivo, dejando libre el espacio del soporte que ocupaba.

Excepciones
Excepcion es, o sencillamente problemas. En la programacin siempre se producen errores,
ms o menos graves, pero que hay que gestionar y tratar correctamente. Por ello en java
disponemos de un mecanismo consistente en el uso de bloques try/catch/finally . La tcnica
bsica consiste en colocar las instrucciones que podran provocar problemas dentro de un
bloque try, y colocar a continuacin uno o ms bloques catch, de tal forma que si se provoca un
error de un determinado tipo, lo que haremos ser saltar al bloque catch capaz de gestionar
ese tipo de error especfico. El bloque catch contendr el codigo necesario para gestionar ese
tipo especfico de error. Suponiendo que no se hubiesen provocado errores en el bloque try,
nunca se ejecutaran los bloques catch.
Veamos ahora la estructura del bloque try/catch/finally:
try {
//Cdigo que puede provocar errores
} catch(Tipo1 var1) {
//Gestin del error var1, de tipo Tipo1
}
[ ...
catch(TipoN varN) {
//Gestin del error varN, de tipo TipoN
}]
[
finally {
//Cdigo de finally
}

Tcnica de Programacin Orientada a Objetos

84

Como podemos ver es obligatorio que exista la zona try, o zona de pruebas, donde pondremos
las instrucciones problemticas. Despus vienen una o ms zonas catch, cada una
especializada en un tipo de error o excepcin. Por ltimo est la zona finally, encargada de
tener un cdigo que se ejecutar siempre, independientemente de si se produjeron o no
errores.
Se puede apreciar que cada catch se parece a una funcin en la cul slo recibimos un objeto
de un determinado tipo, precisamente el tipo del error. Es decir slo se llamar al catch cuyo
argumento sea coincidente en tipo con el tipo del error generado

Archivos de Texto
Archivos necesarios:
Los archivos nos permiten guardar nuestro trabajo para que no perdamos datos una vez que
cerremos la aplicacin. Existen dos tipos de archivos en Java, en este trial veremos los
primeros. Los archivos de texto en Java se manejan mediante la clase BufferedReader y la
clase PrintWriter. Estas dos clases nos permiten manejar los archivos de texto como podemos
ver en la presentacin a continuacin:
Archivos de Texto
Adems de los ejemplos y ejercicios de la presentacin puedes basarte en el siguiente archivo
para aprender a manejar archivos de texto:

Cmo guardar en archivos de texto?


En la computadora, los archivos son un bitstream o "flujo de bits". Esto es para que se puedan
construir fcilmente programas que puedan escribir a cualquier tipo de flujo, ya sean archivos,
la pantalla, la impresora o una red. La clase que nos srive para imprimir bits a un bitstream es
PrintWriter. En la imagen de la izquierda podemos ver que el constructor del PrintWriter recibe
un FileWriter, esto se debe a que el PrintWriter sabe escribir a un flujo, pero no sabe a cul, la
clase FileWriter le permite escribir a un flujo de archivos.
El constructor de FileWriter es muy importante, puede recibir uno o dos parmetros, el primer
parmetro es el nombre del archivo o un objeto de la clase File que represente el archivo que
queremos abrir, el segundo (que es opcional) es un boolean que indica si se debe sobreescribir
el archivo o escribir al final.

Hay dos maneras de escribir a un archivo una vez que ya tenemos el PrintWriter, pero primeor
tenemos que entender una cosa de esta clase. El PrintWriter es un buffer, como una caja en la
que se guarda lo que se va a escribir al archivo y una vez que ya est todo listo se manda al
archivo.

Tcnica de Programacin Orientada a Objetos

85

Para mandar un String a un archivo de texto podemos utilizar dos mtodos, el primero es
println() que recibe una lnea de texto y la imprime en el archivo con un cambio de lnea ("\n") al
final, el segundo mtodo que se utiliza frecuentemente es el mtodo print que funciona
bsicamente de la misma manera, pero no pone un salto de lnea al final y no imprime los datos
al archivo sino nicamente los deja en el buffer, por lo que tenemos que utilizar el mtodo
flush() para que lo imprima al archivo.
Es muy importante recordar que debemos cerrar el archivo al terminar de utilizarlo, ya que en
caso contrario no estamos seguros de que todos los cambios se guarden en el archivo. Para
poder cerrar el archivo utilizamos el mtodo close() del PrintWriter.

Es muy importante recordar que debemos cerrar el archivo al terminar de utilizarlo, ya que en
caso contrario no estamos seguros de que todos los cambios se guarden en el archivo. Para
poder cerrar el archivo utilizamos el mtodo close() del PrintWriter.

Cmo leer de archivos de texto?


El bitstream que creamos al guardar un archivo podemos leerlo mediante la clase
BufferedReader. Pero al igual que la clase PrintWriter esta clase no sabe qu tipo de archivo
est leyendo por lo que hay que especificarle queobtenga el bitstream desde un archivo
utilizando la clase FileReader.
Para construir un FileReader lo nico que tenemos que hacer es utilizar el constructor que
recibe el nombre de archivo o un objeto de la clase File representando el archivo que queremos
leer. Una vez que ya tenemos el FileReader debemos utilizarlo para construir un
BufferedReader, de la manera que se ve a la izquierda.
Una vez que tengamos el BufferedReader podemos utilizar varios mtodos que nos permiten
escribir a archivos de texto. El primero que vamos a ver es el mtodo read(), que nos devuelve
un int con el cdigo Unicode del carcter ledo, para poder convertir este cdigo en un carcter
debemos utilizar un cast a char. Para hacer un cast de un tipo de dato a otro tenemos que
poner la variable que queremos que reciba el valor, un smbolo de igual, el tipo de dato al que
queremos convertir y el valor que queremos convertir, como se ve en la imagen de la izquierda.

Tcnica de Programacin Orientada a Objetos

86

El otro mtodo del BufferedReader que nos va a ser muy til es el mtodo readLine(), este
mtodo nos permite leer todo un archivo mucho ms rpido y nos es muy til cuando queremos
obtener datos de un archivo de inicio ya que podemos leer una lnea cada vez y utilizarla de la
manera que nos convenga.
Al igual que cuando utilizamos el PrintWriter debemos cerrar el archivo al terminarlo de utilizar
utilizando el mtodo close() del BufferedReader ya que aunque en este caso no se pierden
datos, otros programas no van a poder utilizar el archivo hasta que lo cerremos.
Por ltimo vamos a darle un rpido vistazo a la clase File que nos es muy til siempre que
trabajamos con archivos.

El constructor de File recibe un String con la ruta del archivo, una vez que creamos el
objeto tipo File podemos utilizar los siguientes mtodos:

f.canRead(): Devuelve un boolean verdadero en caso de que se pueda leer el archivo,


falso en caso de que no se pueda leer.
f.canWrite(): Devuelve un boolean verdadero en caso de que se pueda escribir el
archivo, falso en caso de que no se pueda escribir.
f.delete(): Intenta borrar el archivo, devuelve true si pudo hacerlo, false en caso de que
no lo haya borrado.
f.deleteOnExit(): Borra el archivo al terminar el programa, muy til cuando
necesitamos un lugar para guardar muchos datos y no queremos saturar la memoria
porque nos permite crear un archivo temporal en el que se guarden los datos.

Tcnica de Programacin Orientada a Objetos

87

Para poder leer archivos de texto en Java debemos crear un objeto de tipo
BufferedReader. BufferedReader es una clase que contiene mtodos predefinidos para
poder leer de una secuencia de bits.
Para poder guardar archivos de texto en Java debemos crear un objeto de tipo
PrintWriter. PrintWriter es una clase que contiene mtodos predefinidos para meter
datos a una secuencia de bits.
Puedes hacer click en los nombres para ver el API que contiene muchos mtodos
tiles.

BufferedReader
El constructor que vamos a utilizar para crear un BufferedReader es:
BufferedReader fileIn = new BufferedReader(new
FileReader(fileName);
Ya que tenemos el objeto tipo BufferedReader podemos utilizar varios mtodos para
leer, l ms comn es:
fileIn.readLine();
Este mtodo lee una lnea y la devuelve o devuelve null si llegamos al final del archivo
y no hay nada que leer.

Es importante recordar cuando trabajamos con archivos que cada que leemos o
escribimos a un archivo debemos hacerlo dentro de un try.
Un try es un manejador de excepciones, cuando sucede un error en la ejecucin de
nuestro programa ejecuta ciertas instrucciones dependiendo del tipo de error que
sucedi.
Otro mtodo muy importante es el mtodo: fileIn.read();

Tcnica de Programacin Orientada a Objetos

88

Este mtodo nos permite leer un solo carcter del flujo de datos. El mtodo regresa un
nmero (int) del 1 al 65535 si puede leer del archivo o regresa -1 si no.

try {
BufferedReader fileIn = new BufferedReader(
new FileReader(fileName));
int i = fileIn.read(); //Iniciamos una variable a la que
//vamos a leer
char c = (char) i; //Como lo que leimos es un int debemos
// hacer un cast a char
} catch (IOException ioe) {
} catch (FileNotFoundException fnfe) {
}

PrintWriter

El constructor que vamos a utilizar para crear un PrintWriter es:


PrintWriter fileOut = new PrintWriter(new FileWriter(fileName);
Ya que tenemos el objeto PrintWriter podemos utilizar varios mtodos para escribir, los
ms comunes son:
fileOut.print(String);
fileOut.println(String);
Estos dos mtodos reciben un String y lo imprimen en el archivo, el segundo mtodo le
pone un carcter de fin de lnea al final.
Al igual que al leer debemos recordar utilizar un try. Cuando utilizamos el PrintWriter
todo entra a un buffer y una vez que terminemos de escribir los datos debemos
recordar utilizar el mtodo flush() del PrintWriter para escribir todo al archivo.
Al terminar de usar el archivo tambin debemos recordar que debemos cerrarlo
mediante el mtodo close() del PrintWriter.

String fileName = "Texto.txt";


PrintWriter fileOut = null;
try {
fileOut = new PrintWriter(new FileWriter(fileName));
String s = "Una linea de texto";
fileOut.println(s);
fileOut.flush();
} catch (IOException ioe) {
System.out("Error, disco protegido contra lectura");
} catch (FileNotFoundException fnfe) {
System.out("Error, no se encuentra el archivo");
} finally {
if (fileIn != null) {
try {
fileIn.close();
} catch (IOException ioe) {
}

Tcnica de Programacin Orientada a Objetos

89

}
}

Ejemplos:
Caso 01
package prjarchivos;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JFrame;
public class ArchivoApp2{
public static void main(String[] args) {
FileReader entrada=null;
StringBuffer str=new StringBuffer();
try {
entrada=new FileReader("VERARCHI01.txt");
int c;
while((c=entrada.read())!=-1){
str.append((char)c);
}
System.out.println(str);
System.out.println("--------------------------------------");
}
catch (IOException ex) {
System.out.println("El archivo no existe");
}
finally{
//cerrar los flujos de datos
if(entrada!=null){
try{
entrada.close();
}
catch(IOException ex){}
}
System.out.println("el bloque finally siempre se ejecuta");
}
}
}

Caso 02
package prjrarchivos2;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JOptionPane;
import pckPrincipal.FrmLlamar;

Tcnica de Programacin Orientada a Objetos

90

public class Class1 extends FrmLlamar{


public Class1() {
String nombre=" VERARCHI02.txt";
BufferedReader entrada;
try {
entrada = new BufferedReader(new FileReader(nombre));
String texto="";
while(true){
texto = entrada.readLine();
//JOptionPane.showMessageDialog(null,texto);
if(texto==null) break;
System.out.println(texto);
this.txt.append(texto+"\n");
}
entrada.close();
this.setVisible(true);
}catch(FileNotFoundException f){
} catch (IOException e) {
// TODO
}
}
}

Caso 03
package pckClase;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import pckAplica.FrmArchivo3;
public class ClassAr3 {
public String datos[]=new String[50];
public int i,pos,tam;
public ClassAr3() {
}
public void llamar(){
String subStr="";
String nombre="ArchivoApp2.txt";
BufferedReader entrada;
try {
entrada = new BufferedReader(new FileReader(nombre));
String texto="";

Tcnica de Programacin Orientada a Objetos

91

while(true){
texto = entrada.readLine();
/* tam=texto.length();
for(int g=0;g<tam;++g){
String j=String.valueOf(texto.charAt(g));
//JOptionPane.showMessageDialog(null,j);
if(j.equals(",")){
datos[i]=subStr;
++i;
}
else
subStr=subStr+j;
}
*/
if(texto==null) break;
System.out.println(texto);
}
entrada.close();
}catch(FileNotFoundException f){
} catch (IOException e) {
// TODO
}
}
}

Caso Prctico: Usando la Tcnica P.O.O:


Guarda registro, cdigo, Nombre, Apellido, Carrera y pago dentro de un Archivo. Para ello cree
la siguiente estructura de trabajo.

Desarrollo:

Tcnica de Programacin Orientada a Objetos

92

En el paquete Paneles se usaran: Contenido(tendr los controles para el ingreso de


datos) y pie(presentara la fecha y hora del sistema, utilizaremos el GregorianCalendar).
En la capa lgica 2 subclases: ClassEncapsulada(se crearan los get y set por cada
atributo que se tenga) y ClassMetodos(se creara los mtodos para generar el cdigo y
hallar el pago de acuerdo a la especialidad)
Los Frame son los objetos visualizadores de los paneles

Empecemos a codificar

package pckLogico;
public class ClassEncapsulada {
String nom,ape,cod;
int p,reg;
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getApe() {
return ape;
}
public void setApe(String ape) {
this.ape = ape;
}
public int getP() {
return p;
}
public void setP(int p) {
this.p = p;
}
public int getReg() {
return reg;
}
public void setReg(int reg) {
this.reg = reg;
}
public String getCod() {
return cod;
}

Tcnica de Programacin Orientada a Objetos

93

public void setCod(String cod) {


this.cod = cod;
}
}// fin de la clase encapsulada
package pckLogico;
public class ClassMetodos {
int x=11,dv,pag;
GregorianCalendar formato=new GregorianCalendar();
int devNV(char letra){
switch(letra){
case 'a':case 'A':dv=1;break;
case 'e':case 'E':dv=2;break;
case 'i':case 'I':dv=3;break;
case 'o':case 'O':dv=4;break;
case 'u':case 'U':dv=5;break;
default : dv=x;
++x;
}
return(dv);
}
public String genera(String cadN,String cadA){
int ao=formato.get(formato.YEAR);
int mes=formato.get(formato.MONTH)+1;
//Datos del Nombre
char n1=cadN.charAt(0);
int largoN=cadN.length();
char n2=cadN.charAt(largoN-1);
//datos del Apellido
char a1=cadA.charAt(0);
int largoA=cadA.length();
char a2=cadA.charAt(largoA-1);
String cad=(""+ao+devNV(n1)+devNV(n2)+devNV(a1)+devNV(a2)+mes);
return(cad);
}
public int pago(int index){
switch(index){
case 1: pag=850;break;
case 2: pag=750;break;
case 3: pag=600;break;
case 4: pag=700;break;
case 5: pag=750;break;
case 6: pag=680;break;
}
return(pag);
}
}// fin de la clase Metodos

Tcnica de Programacin Orientada a Objetos

94

Uso de los paneles: disee todo este formato


package pckPaneles;
public class pnlContenido extends JPanel {
ClassMetodos llamar=new ClassMetodos();
ClassEncapsulada atri=new ClassEncapsulada();
ClassArchivo datos=new ClassArchivo();
int dv,c=1,x=11;
String titulos[]={"Registro","Codigo","Nombres","Apellidos","Categoria","Pago"};
String contenido[][]={};
private JTextField TXTNOM = new JTextField();
private JTextField TXTAPE = new JTextField();
private JComboBox cboespe = new JComboBox();
private JLabel lblp = new JLabel();
private JSeparator jSeparator1 = new JSeparator();
private JSeparator jSeparator2 = new JSeparator();
private JButton btnaadir = new JButton();
private JButton btnsalir = new JButton();
private JScrollPane jScrollPane1 = new JScrollPane();
private JTable jTable1 = new JTable();
private DefaultTableModel modtbdatos = new DefaultTableModel(contenido,titulos);
private JButton btnLsitaAr = new JButton();
*******************
private void jbInit() throws Exception {
************************
modtbdatos.setColumnCount(6);
***************************
jTable1.setModel(modtbdatos);
cboespe.addItem("Seleccionar cat");
cboespe.addItem("Sistemas");
cboespe.addItem("Redes");
cboespe.addItem("Diseo Grafico");
cboespe.addItem("Contabilidad");
cboespe.addItem("Administracion");
cboespe.addItem("Otros");
}

private void btnaadir_actionPerformed(ActionEvent e) {


atri.setReg(c);
x=11;
atri.setNom(TXTNOM.getText());
atri.setApe(TXTAPE.getText());
atri.setCod(llamar.genera(atri.getNom(),atri.getApe()));
Object
valores[]={atri.getReg(),atri.getCod(),atri.getNom(),atri.getApe(),cboespe.getSelectedItem(),atri.
getP()};
modtbdatos.addRow(valores);

Tcnica de Programacin Orientada a Objetos

95

datos.Grabar(atri.getReg(),atri.getCod(),atri.getNom(),atri.getApe(),atri.getCod(),atri.getP());
++c;
}

private void cboespe_actionPerformed(ActionEvent e) {


atri.setCod(cboespe.getSelectedItem().toString());
lblp.setText(""+atri.getP());
atri.setP(llamar.pago(cboespe.getSelectedIndex()));
}
private void btnListaAr_actionPerformed(ActionEvent e) {
Frmlectura x=new Frmlectura();
x.setVisible(true);
}
}//fin del panel contenido

// Panel Pie
package pckPaneles;
public class pnlPie extends JPanel {
GregorianCalendar formato=new GregorianCalendar();
************************

private void jbInit() throws Exception {


********************************
int dia=formato.get(formato.DAY_OF_MONTH);
int mes=formato.get(formato.MONTH)+1;
int ao=formato.get(formato.YEAR);
lblf.setText(""+dia+"/"+mes+"/"+ao);

Tcnica de Programacin Orientada a Objetos

96

lblf.setFont(new Font("Dialog", 1, 11));


int hora=formato.get(formato.HOUR_OF_DAY);
int min=formato.get(formato.MINUTE);
int seg=formato.get(formato.SECOND);
lblh.setFont(new Font("Dialog", 1, 11));
lblh.setText(""+hora+":"+min+":"+seg);
}
}//fin del panel pie

// estableciendo los paneles al Frame


package pckPresentacion;
public class FrmPresenta extends JFrame {
int dv=0;
ClassEncapsulada atri=new ClassEncapsulada();
GregorianCalendar formato=new GregorianCalendar();
private pnlPie pnlPie1 = new pnlPie();
private pnlContenido pnlEncabezado1 = new pnlContenido();

public FrmPresenta() {
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
this.getContentPane().setLayout( null );
this.setSize(new Dimension(400, 408));
this.setResizable(false);
this.setTitle("Usando Archivos");
pnlPie1.setBounds(new Rectangle(0, 345, 395, 40));
pnlEncabezado1.setBounds(new Rectangle(0, 0, 395, 345));
this.getContentPane().add(pnlEncabezado1, null);
this.getContentPane().add(pnlPie1, null);
}
}

Tcnica de Programacin Orientada a Objetos

97

Tcnica de Programacin Orientada a Objetos

98

Contenidos
- Definicin de la Clase Vector.
- Definicin de la Clase ArrayList.
- Diferencias entre ellas
- Mtodos de la clase Vector y ArrayList
- Aplicando atributos encapsulados usando estas clases
- Definicin de la la Clase Hashtable.
- Mtodos get y put
____________________________________________________________________________

Vector
Es una clase que permite crear matrices dinmicas, es decir matrices que varan en cantidad
de elementos durante la ejecucin del programa, lo cual no se puede hacer en java con la clase
Array que es la clase que generalmente se utiliza para crear matrices.
En un Vector, puedo agregar cualquier cosa, incluso puedo agregar diferentes tipos de objetos
a un mismo vector, esto se debe a que Vector almacena objetos de tipo Object que es la clase
base de Java. Esto no puedo hacerlo con un Array ya que todos sus elementos deben ser del
mismo tipo.
Por este motivo, cuando accedo a un elemento de un Vector, debo moldearlo a su tipo
especfico de datos, de lo contrario obtendr un objeto de tipo Object.
La clase Enumeration se utiliza con un vector o mejor dicho, se crea a partir de la cantidad de
elementos de un vector, ya que lo nico que hace Enumeration es enumerar los elementos de
un vector. Enumeration lo nico que hace es recorrer los elementos de un vector hacia
adelante mediante el mtodo nextElement (), asegurando que nunca se pasar del ndice del
vector, esto lo hace mediante el mtodo hasMoreElements().
Solo para eso sirve Enumeration, pero asegura que no habr error por salirse del ndice del
vector. Este es un ejemplo de cmo utilizar ambas clases juntas:

Tcnica de Programacin Orientada a Objetos

99

Crear un vector
Para usar la clase Vector hemos de poner al principio del archivo del cdigo fuente la siguiente
sentencia import
import java.util.*;
import java.util.Vector;
Cuando creamos un vector u objeto de la clase Vector, podemos especificar su dimensin
inicial, y cuanto crecer si rebasamos dicha dimensin.
Vector VecDatos=new Vector(20, 5);

Tenemos un vector con una dimensin inicial de 20 elementos. Si rebasamos dicha


dimensin y guardamos 21 elementos la dimensin del vector crece a 25.

Al segundo constructor, solamente se le pasa la dimensin inicial.

Vector VecDatos =new Vector(20);

Si se rebasa la dimensin inicial guardando 21 elementos, la dimensin del vector se


duplica.
El programador ha de tener cuidado con este constructor, ya que si se pretende
guardar un nmero grande de elementos se tiene que especificar el incremento de la
capacidad del vector, si no se quiere desperdiciar intilmente la memoria el ordenador.

Con el tercer constructor, se crea un vector cuya dimensin inicial es 10.

Vector VecDatos =new Vector();

La dimensin del vector se duplica si se rebasa la dimensin inicial, por ejemplo,


cuando se pretende guardar once elementos.

Aadir elementos al vector


Hay dos formas de aadir elementos a un vector. Podemos aadir un elemento a continuacin
del ltimo elemento del vector, mediante la funcin miembro addElement.

VecDatos.addElement("uno");
Podemos tambin insertar un elemento en una determinada posicin, mediante
insertElementAt. El segundo parmetro o ndice, indica el lugar que ocupar el nuevo objeto.
Si tratamos de insertar un elemento en una posicin que no existe todava obtenemos una
excepcin del tipo ArrayIndexOutOfBounds. Por ejemplo, si tratamos de insertar un elemento
en la posicin 9 cuando el vector solamente tiene cinco elementos.

Tcnica de Programacin Orientada a Objetos

100

Ejemplo: Para insertar el string "tres" en la tercera posicin del vector v, escribimos
VecDatos.insertElementAt("tres", 2);

En la siguiente porcin de cdigo, se crea un vector con una capacidad inicial de 10 elementos,
valor por defecto, y se le aaden o insertan objetos de la clase String.

private void btnAgregar_actionPerformed(ActionEvent e) {


Vector vecDatos =new Vector();
vecDatos.addElement("Veronica");
vecDatos.addElement("William");
vecDatos.addElement("Sebastian");
vecDatos.addElement("Angie");
vecDatos.addElement("Victor");
vecDatos.addElement("Carlos");
vecDatos.addElement("Henrry");
vecDatos.addElement("Eduardo");
//vecDatos.insertElementAt("Tres", 2);
//se crea una enumeracion de acuerdo a los elementos del vector
Enumeration enume =vecDatos.elements();
//mientras queden elementos en la enumeracion
while(enume.hasMoreElements())
modLstDatos.addElement(enume.nextElement());
}

Tcnica de Programacin Orientada a Objetos

101

Para saber cuntos elementos guarda un vector, se llama a la funcin miembro size. Para
saber la dimensin actual de un vector se llama a la funcin miembro capacity.
Agregue esta 2 lneas al cdigo anterior.

lblT.setText(""+vecDatos.size());
lblD.setText(""+vecDatos.capacity());

Podemos eliminar todos los elementos de un vector, llamando a la funcin miembro


removeAllElements. O bien, podemos eliminar un elemento concreto, por ejemplo el que
guarda el string "tres".
vecDatos.removeElement("Angie");

Podemos eliminar dicho elemento, si especificamos su ndice.


vecDatos.removeElementAt(2);

Acceso a los elementos de un vector


El acceso a los elementos de un vector no es tan sencillo como el acceso a los elementos de
un array. En vez de dar un ndice, usamos la funcin miembro elementAt. Por ejemplo,
vecDatos.elementAt(4) sera equivalente a vecDatos [4], si vecDatos fuese un array.
Para acceder a todos los elementos del vector, escribimos un cdigo semejante al empleado
para acceder a todos los elementos de un array.
for(int i=0; i<v.size(); i++){
System.out.print(vecDatos.elementAt(i)+"\t");
}
Existe otra alternativa, que es la de usar las funciones del interface Enumeration. Este
interface declara dos funciones pero no implementa ninguna de ellas. Una Enumeration nos
permite acceder a los elementos de una estructura de datos de forma secuencial, como ya lo
hemos mostrado en el ejemplo anterior.

Tcnica de Programacin Orientada a Objetos

102

public interface Enumeration {


boolean hasMoreElements();
Object nextElement();
}
La funcin miembro elements de la clase Vector devuelve un objeto de la clase
VectorEnumerator que implementa el interface Enumeration y tiene que definir las dos
funciones hasMoreElements y nextElement.
final class VectorEnumerator implements Enumeration {
Vector vector;
int count;
VectorEnumerator(Vector vecDatos) {
vector = vecDatos;
count = 0;
}
public boolean hasMoreElements() {
//...
}
public Object nextElement() {
//...
}
}
El objeto enum devuelto por la funcin miembro elements es de la clase VectorEnumerator, sin
embargo no podemos escribir
VectorEnumerator enum= vecDatos.elements();
porque VectorEnumerator no es una clase pblica. Como podemos ver en su definicin, no
tiene la palabra reservada public delante de class. Sin embargo, podemos guardar un objeto
de la clase VectorEnumerator en una variable enum del tipo Enumeration, por que la clase
implementa dicho interface.
Enumeration enum= vecDatos.elements();
while(enum.hasMoreElements()){
System.out.print(enum.nextElement()+"\t");
}

Tcnica de Programacin Orientada a Objetos

103

Desde el objeto enum devuelto por la funcin miembro elements de la clase Vector llamamos a
las funciones miembro hasMoreElements y nextElement de la clase VectorEnumerator. La
funcin hasMoreElements devuelve true mientras haya todava ms elementos que se
puedan acceder en el vector v. Cuando se ha llegado al ltimo elemento del vector, devuelve
false. La funcin nextElement devuelve una referencia al prximo elemento en la estructura de
datos. Esta funcin devuelve una referencia a un objeto de la clase base Object, que el
programador precisar en ciertos casos, como veremos ms abajo, promocionar (casting) a la
clase adecuada.
Para buscar objetos en un vector se puede usar una Enumeration y hacer una comparacin
elemento por elemento mediante equals, tal como vemos en la siguiente porcin de cdigo

Enumeration enum=vecDatos.elements();
while(enum.hasMoreElements()){
String elemento=(String)enum.nextElement();
if(elemento.equals("William")){
lblEnc.setText("Encontrado William");
break;
}
}

Algunos de los mtodos de la clase Vector se muestran a continuacin:


Vector ( )
Constructor: crea un vector inicialmente vaco
void addElement (Objet obj)
Inserta el objeto especificado al final del vector
void setElementAt (Object obj, int indce)
Inserta el objeto especficado en el vector en la posicin especficada
Object remove (int indce)
Elimina el objeto que se encuentra en la posicin especficada y lo regresa
boolean removeElement (Object obj)
Elimina la primera occurencia del objeto especficado en el vector
void removeElementAt (int indce)
Elimina el objeto especficado en el ndice del vector
void clear ( )
Elimina todos los objetos del vector
boolean contains (Object obj)

Tcnica de Programacin Orientada a Objetos

104

Regresa verdadero si el objeto dado pertenece al vector


int indexOf (Object obj)
Regresa el ndice del objeto especficado. Regresa -1 si no fue encontrado
el objeto
Object elementAt (int indce)
Regresa el componente en el ndice especficado
boolean isEmpty ( )
Regresa verdadero si el vector no contiene elementos
int size ( )
Regresa el nmero de elementos en el vector

Ejemplo 01:
import java.util.Vector;
public class VerCasoVector{
public static void main () {
Vector DocentesSta = new Vector ();
DocentesSta.addElement ("Veronica");
DocentesSta.addElement ("William");
DocentesSta.addElement ("Victor");
DocentesSta.addElement ("Rogelio");
DocentesSta.addElement ("Carlos");

ModLstDatos.addElement(DocentesSta);
//Quita el elemento
DocentesSta.removeElement ("Rogelio");

ModLstDatos.setText(DocentesSta);
lblP.setText("En la posicin 1 est: " + DocentesSta.elementAt (1));
DocentesSta.insertElementAt ("Angie", 2);

lblT.setTexr("Tamao de la banda: " + DocentesSta.size ());


for (int i = 0; i < DocentesSta.size (); i++)
ModLstDatos.addElement(DocentesSta);
}
}

Tcnica de Programacin Orientada a Objetos

105

Si se necesitan aadir valores de datos primitivos a un Vector se pueden utilizar las clases
conocidas como envoltorios que son: Integer, Long, Double y Float. Sus mtodos de conversin
respectivos son: intValue ( ), longValue ( ), doubleValue ( ) y floatValue ( ).
Ejercicio:
Complemente la siguiente clase, escribiendo las instrucciones necesarias donde se muestran
los subguiones(__), guate del ejemplo anterior:
import java.util.*;
/**
* Uso de las clases Vector e Integer
*/
public class EjercicioVector
{
public static void main ()
{
Vector vecDatos = new Vector ();
vecDatos.add (new Integer (1));
vecDatos.add (new Integer (3));
vecDatos.add (new Integer (5));
for (int i = 0; i < v.size (); i++) {
Integer iI = (Integer) v.get (i);
ModLstDatos.addElement(iI.______________() + " ");
}
// Insertar un nuevo Objeto de tipo Integer cuyo valor sea 10
______________________
//El nuevo vector es
__________________
____________________
// Insertar un nuevo Objeto de tipo Integer cuyo valor sea 6 en la pos.3
System.out.println ("Se inserta un nuevo objeto cuyo valor es 6 en la posicin 3");
___________________________
//El nuevo vector es
_______________________________________
// Eliminar el objeto que contiene al Integer cuyo valor es 3
____________________
//El nuevo vector es
_______________________________
// Escribir el valor del segundo objeto
txtArea.append("El valor del segundo objeto es: " + _____________+\n);
// Determinar el nmero de objetos del vector
txtArea.append ("El tamao del vector es: " + _____________+\n);
// Eliminar el tercer objeto y escribir su valor
txtArea.append ("En la tercera posicin haba un: " + _____________+\n);

Tcnica de Programacin Orientada a Objetos

106

//El nuevo vector es


_____________________________
}
}
Ejemplo 02:
package pckLogico;
import java.util.Enumeration;
import java.util.Vector;
public class ClassVector1 {
Vector Numeros = new Vector();//se crea un vector
public ClassVector1() {
for (int a = 0; a < 100; a++){
Numeros.addElement(a);//se agrega elementos al vector
}
Enumeration enume = Numeros.elements();//se crea una enumeracion de acuerdo a los
elementos del vector
while(enume.hasMoreElements())//mientras queden elementos en la enumeracion
System.out.println((Integer)enume.nextElement()); //se moldea el objeto del vector para
poder imprimirlo
}
}
package pckEjecutar;
import pckLogico.ClassVector1;
public class ClassPrincipal {
public static void main(String[] args) {
ClassVector1 x;
x=new ClassVector1();
}
}

Tcnica de Programacin Orientada a Objetos

107

La clase ArrayList
Las aplicaciones frecuentemente necesitan almacenar un grupo de datos en un slo objeto.
Los arrays sirven bien para este propsito, pero algunas veces necesitamos incrementar o
reducir dinmicamente el nmero de elementos del array, o hacer que contenga distintos tipos
de datos
Esto es comn entre las aplicaciones como las tiendas online. Un cliente aade una mercanca
a su carro de la compra, y detrs de la escena, los tems son almacenados y eliminados
automticamente.
Para esta clase de grupos de datos crecientes y menguantes, podemos usar la clase Vector , o
la reciente clase ArrayList del paquete java.util .
Un ArrayList contiene tantos objetos como necesitemos.
ArrayList tiene varios constructores, dependiendo de cmo necesitemos construir el ArrayList

Los siguientes dos constructores nos ayudarn a empezar:


ArrayList() construye un ArrayList con capacidad cero
por defecto, pero crecer segn le vayamos
aadiendo:
ArrayList al = new ArrayList();
ArrayList(int initialCapacity) construye un ArrayList
vaco con una capacidad inicial especificada:
ArrayList al2 = new ArrayList(5);

Un objeto ArrayList slo contiene referencias a objetos. Para almacenar tipos primitivos como
double long o float ,

Si necesitamos circular a travs de los elementos del ArrayList , usamos la clase


Iterator y sus mtodos hasNext y next :
Iterator alIt = al.iterator();
while (alIt.hasNext()){
ModLstDatos(alIt.next() + " ");
}

ArrayList es una de las muchas clases del Collection Framework , que proporciona un
conjunto de interfaces y clases bien-diseados para almacenar y manipular grupos de datos
como una sola unidad, una coleccin.
Es una Lista volcada en un Array. Se debe utilizar en lugar de Vector como almacenamiento de
objetos de propsito general. Permite un acceso aleatorio muy rpido a los elementos, pero
realiza con bastante lentitud las operaciones de insertado y borrado de elementos en medio de
la Lista. Se puede utilizar un ListIterator para moverse hacia atrs y hacia delante en la Lista,
pero no para insertar y eliminar elementos.
Ventajas
Un ArrayList es un array dinmico. No tiene restricciones de capacidad. Su tamao se ajusta
de forma dinmica.

Tcnica de Programacin Orientada a Objetos

108

Constructor por defecto: new ArrayList(). Inicialmente, la capacidad de un ArrayList creado as


es 0.
Los elementos dentro de un ArrayList son Objetos. No pueden ser de tipo bsico, pero
pueden ser de cualquier tipo de objeto.
La clase ArrayList forma parte del paquete java.util Para poner un elemento dentro de esta
estructura, usamos el mtodo add y para recoger un elemento usamos el mtodo get.
Ejemplo 01: ArrayListEjem01
import java.util.*;
public class ArrayListEjem01 {
public static void main(String[ ] args) {
ArrayList Saludo = new ArrayList();
Saludo.add("Sise");
Saludo.add("te");
Saludo.add("da la");
Saludo.add("Bienvenidaa");
Saludo.add("..");
for (int i=0;i<Saludo.size();i++)
ModLstSaludos(Saludos.get(i)+" ");
}
}

Mtodos de ArrayList
int size().- El tamao actual (puede ser 0)
void add(obj).- Aade un objeto al final del ArrayList, incrementando su tamao de
obj es un objeto.
Object get(N).- Devuelve el elemento almacenado a la posicin N en el ArrayList.
N tiene que ser un entero entre 0 y size()-1.
Nota:
En ArrrayListInteger.java, se convierte el objeto devuelto por get() a un Integer con
casting.
En ArrayListString.java, se convierte el objeto devuelto por get() a un String llamando al
mtodo toString() de Object.
Ejemplo 01: Usando el ArrayList
import java.util.ArrayList;
public class ArrayListEntero {
public static void main(String[] args) {
ArrayList numeros = new ArrayList();
Integer num1 = new Integer(10);
Integer num2 = new Integer(20);
Integer num3 = new Integer(30);
Integer num4 = new Integer(40);
numeros.add(num1);
numeros.add(num2);
numeros.add(num3);
numeros.add(num4);
int suma=0;
for (int i=0;i<numeros.size();i++) {
Integer vanum = (Integer)numeros.get(i);
suma = suma + vanum.intValue();
txtArea.append(vanum);
if (i<numeros.size()-1)
txtArea.append ("+");
else
txtArea.append ("=");
}

Tcnica de Programacin Orientada a Objetos

109

txtArea.append(\n+suma);
}
}
import java.util.*;
public class ArrayListString {
public static void main(String[] args) {
ArrayList Saludo = new ArrayList();
Saludo.add("Sise");
Saludo.add("te");
Saludo.add("da la");
Saludo.add("Bienvenidaa");
Saludo.add("..");
for (int i=0;i<Saludo.size();i++)
Object objecto = Saludo.get(i);
String cadena = objecto.toString();
cadena = cadena.toUpperCase();
txtSalida.append(cadena+" ");
}
}

Ms Mtodos de ArrayList
void set(index, obj): Sustituye el elemento en la posicin index por el objeto obj.
(index tiene que ser entre 0 y size()-1) dentro del ArrayList, sustituyendo el elemento
previamente almacenado a la posicin N. Es equivalente a A[N] = obj para un array A.
Object remove(index) -- Elimina el elemento a la posicin index (index entre 0 y size()-1).

ArrayList remplaza a Vector y Iterator remplaza a Enumeration:

Se puede crear un objeto ArrayList y moldearlo a una Collection. Al utilizar mtodos de


Collection, cualquier objeto de una clase derivada de Collection debera funcionar, pero se crea
un ArrayList porque es el caballo de batalla de las colecciones y viene a tomar el relevo al
Vector.
El mtodo add(), como su nombre sugiere, coloca un nuevo elemento en la coleccin. Sin
embargo, la documentacin indica claramente que add() "asegura que la coleccin contiene el
elemento indicado". Esto es para que un Set tenga significado, ya que solamente aadir el
elemento si no se encuentra en la coleccin. Para un ArrayList, o cualquier otra lista ordenada,
add() significa siempre "colocarlo dentro".
Todas las colecciones pueden producir un Iterator invocando al mtodo iterator(). Un Iterator
viene a ser equivalente a una Enumeration, a la cual reemplaza, excepto en los siguientes
puntos:
Utiliza un nombre que est histricamente aceptado y es conocido en toda la literatura de
programacin orientada a objetos
Utiliza nombres de mtodos ms cortos que la Enumeration: hasNext() en vez de
hasMoreElements(), o next() en lugar de nextElement().

Tcnica de Programacin Orientada a Objetos

110

Crear el siguiente Caso utilizando la clase primita ArrayList.

// Clase Encapsulada
package PckLogico;
public class ClassEncapsulada {
String nombre,apellido,condicion;
int reg,nota1,nota2,nota3,nota4;
double promedio;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public int getNota1() {
return nota1;
}
public void setNota1(int nota1) {
this.nota1 = nota1;
}
public int getNota2() {
return nota2;
}
public void setNota2(int nota2) {
this.nota2 = nota2;
}

Tcnica de Programacin Orientada a Objetos

111

public int getNota3() {


return nota3;
}
public void setNota3(int nota3) {
this.nota3 = nota3;
}
public int getNota4() {
return nota4;
}
public void setNota4(int nota4) {
this.nota4 = nota4;
}
public String getCondicion() {
return condicion;
}
public void setCondicion(String condicion) {
this.condicion = condicion;
}
public int getReg() {
return reg;
}
public void setReg(int reg) {
this.reg = reg;
}
public double getPromedio() {
return promedio;
}
public void setPromedio(double promedio) {
this.promedio = promedio;
}
}//fin de la clase encapsulada
// ClassMetodos
package PckLogico;
import java.util.ArrayList;
public class ClassMetodo{
static ArrayList Registros;
public ClassMetodo(){
Registros= new ArrayList();
}
public void AddRegistro(ClassEncapsulada Datos){
Registros.add(Datos);
}
public ClassEncapsulada getEncapsulada(int i){
return((ClassEncapsulada)Registros.get(i));
}
public int tamao(){
return(Registros.size());
}
}

Tcnica de Programacin Orientada a Objetos

112

//ClassEjecutar
package PckPrincipal;
import PckPresentacion.FrmAcceso;
import PckPresentacion.FrmDatos;
public class ClassEjecutar {
public static void main(String[] args) {
FrmAcceso prin= new FrmAcceso();
prin.setVisible(true);
// Cerrar una ventana
}
}

// uso del FRAME


public class FrmDatos extends JFrame {
//inicializacion
ClassEncapsulada atri;
ClassMetodo metodos;
String valores[][]={};
Stringnombres[]={"Reg","Nombre","Apellido","Nota 1","Nota 2","Nota 3","Nota 4",
"Promedio","Condicion"};
int R=1;
**********************************
**********************************
private void jbInit() throws Exception {
**********************************
**********************************
**********************************
**********************************
lblreg.setText(""+R);
atri=new ClassEncapsulada();
metodos=new ClassMetodo();
}
void datos(){
atri.setNombre(txtnom.getText());
atri.setApellido(txtape.getText());
atri.setNota1(Integer.parseInt(txtN1.getText()));
atri.setNota2(Integer.parseInt(txtN2.getText()));
atri.setNota3(Integer.parseInt(txtN3.getText()));
atri.setNota4(Integer.parseInt(txtN4.getText()));
atri.setPromedio((atri.getNota1()+atri.getNota2()+atri.getNota3()+atri.getNota4())/4.0);
lblPromedio.setText(""+atri.getPromedio());
if(atri.getPromedio()>=10.5) atri.setCondicion("Aprobado");
else atri.setCondicion("Desaprobado");
lblCondicion.setText(atri.getCondicion());
}

Tcnica de Programacin Orientada a Objetos

113

void Eliminar(){
int fila=tbl_d.getSelectedRow();
modTDatos.removeRow(fila);
}
private void btnAgregar_actionPerformed(ActionEvent e) {
datos();
Object valores[]={R,atri.getNombre(),atri.getApellido(),atri.getNota1(),atri.getNota2(),
atri. getNota3(),atri.getNota4(),atri.getPromedio(),atri.getCondicion()};
modTDatos.addRow(valores);
++R;
}
private void jButton1_actionPerformed(ActionEvent e) {
//Ir al Inicio del registro de la Tabla
tbl_d.setRowSelectionInterval (0,0);
}
private void jButton2_actionPerformed(ActionEvent e) {
//Ir al Siguiente Registro de la Tabla
if ( tbl_d.getSelectedRow() != 0 ) {
tbl_d.setRowSelectionInterval (tbl_d.getSelectedRow()+1, tbl_d.getSelectedRow() +1);
}
}
private void jButton3_actionPerformed(ActionEvent e) {
//Ir al Anterio de la Tabla
if ( tbl_d.getSelectedRow() != 0 ) {
tbl_d.setRowSelectionInterval (tbl_d.getSelectedRow()-1, tbl_d.getSelectedRow() -1);
}
}
private void jButton4_actionPerformed(ActionEvent e) {
//Implementa para ir al final del registro de la tabla
}
private void btnSalir_actionPerformed(ActionEvent e) {
System.exit(0);
}
private void btnEliminar_actionPerformed(ActionEvent e) {
Eliminar();
}
private void btnBuscar_actionPerformed(ActionEvent e) {
/* Implementa Este boton
}
}// fin del Frame

Tcnica de Programacin Orientada a Objetos

114

//Frame Acceso
private void btnAceptar_actionPerformed(ActionEvent e) {
String Nombre, clave;
Nombre= txtNombre.getText();
clave=txtClave.getText();
if(Nombre.equalsIgnoreCase("SISE")&&clave.equalsIgnoreCase("2010")){
FrmDatos prin=new FrmDatos();
prin.setVisible(true);
this.dispose();
}
}

Tcnica de Programacin Orientada a Objetos

115

Contenidos
- Uso de mens(JMenu)
- JProgressBar,
- JColorChooser, JFileChooser,
- InternalFrame
- Implementacin de Libreras
- Creacin de Archivos Jar Ejecutables
____________________________________________________________________________

Mens

Un men en una aplicacin no es ms que un MenuBar en el que hay varios mens.


Pensemos en un programa cualquiera con las voces de men File Edit y Help. Estas tres voces
en Java son unos objetos de la clase Men y se tienen que aadir a un objeto de la clase
MenuBar que se une a la ventana. Cada men tiene varias voces. Por ejemplo, el men
Archivo tendr las voces: Abrir, Cerrar, Guarda y Salir. stos en Java son unos objetos de la
clase MenuItem (o tambin Men si incluyen otros submens).
Por lo tanto, si a una aplicacin le quisieramos aadir un men tendramos hacer las siguientes
cosas siguiendo un rden cualquiera:
Crear los objetos MenuItem
Crear los objetos men y pegarles los MenuItem
Crear una MenuBar y pegarles los Mens

Adems, como siempre, tenemos que escribir unos gestores para los sucesos de los mens y
asociarlos a los mens.
Los sucesos de los MenuItem son los que tenemos que gestionar nosotros a diferencia de los
sucesos de los mens que los gestiona el sistema. Mientras los segundos sirven para que
aparezcan y desaparezcan las voces del men, los primeros son los clicks sobre la orden
correspondiente al Item.

Tcnica de Programacin Orientada a Objetos

116

Por lo tanto, para stos tendremos que escribir unos ActionListener, como para los botones.
Realmente no son otra cosa que unos botones especiales. Los constructores son tres:
MenuItem() , que construye un MenuItem sin etiqueta.
MenuItem(String label), que construye MenuItem con etiqueta label.
MenuItem(String label, MenuShortcut s), que construye un MenuItem con etiqueta label
y acelerador (tecla de opcin rpida) definido en MenuShortcut s.
Algunos mtodos son:
addActionListener(ActionListener l), asocia un ActionListener al MenuItem para
escuchar los sucesos de tipo ActionEvent (el clic).
void deleteShortcut(), borra la tecla de opcin rpida para el menuitem.
String getActionCommand(), da la accin asociada al MenuItem. La accin es la
que pasa al actionListener del botn para identificar el botn mismo. As varios item
pueden tener el mismo gestor de sucesos que podr distinguir el botn clicado
basndose en la rden que le llega.
String getLabel(), devuelve la etiqueta del MenuItem
EventListener[]getListeners(Class listenerType) , devuelve todos los oyentes de
sucesos asociados al MenuItem, del tipo listenerType.
MenuShortcut getShortcut(), devuelve la definicin del acelerador para el
MenuItem.
boolean isEnabled(), dice si el men esta disponible o no. Si no lo est se
visualizar en gris.
void removeActionListener(ActionListener l), elimina el oyente asociado.
void setActionCommand(String command), ajusta la orden asociada al
MenuItem. Si no est especificado, la rden es la etiqueta del MenuItem.
void setEnabled(boolean b), habilita y deshabilita el MenuItem.
void setLabel(String label), ajusta la etiqueta para el MenuItem.
void setShortcut(MenuShortcut s), define el acelerador para el men.
Por lo tanto, para crear los Item del men Archivo descrito antes tendremos que escribir:
MenuItem abrir=new MenuItem("Abrir");
MenuItem cerrar=new MenuItem("Cerrar");
MenuItem guardar=new MenuItem("Guardar");
MenuItem salir=new MenuItem("Salir");
Por tanto creamos el objeto Menu para pegar los MenuItem.
Dos constructores del objeto son:
Menu(), construye un Men sin etiqueta
Menu(String label), construye un men con etiqueta label.

Tcnica de Programacin Orientada a Objetos

117

Cmo Usar MonitoProgress?


Una tarea ejecutndose en un programa puede tardar un poco en completarse. Un programa
amigable proporciona alguna indicacin al usuario sobre lo que puede tardar la tarea y lo que
ya lleva realizado.
El paquete Swing proporciona tres clases para ayudar a crear GUIs que monitoricen y
muestren el progreso de tareas de larga duracin.

JProgressBar
Una barra de progreso que muestra grficamente qu cantitad total de la tarea se ha
terminado. Puedes ver Cmo usar Progress Bars para ms informacin.

ProgressMonitor
Un ejemplar de esta clase monitoriza el progreso de una tarea. Si el tiempo enlapsado
de la tarea excede un valor especificado en el programa, el monitor trae un dilogo con
una descripcin de la tarea, una nota de estado, una barra de progreso, un botn Ok, y
un botn Cancel. Puedes ver Cmo usar Progress Monitors para ms detalles.

ProgressMonitorInputStream
Un stream de entrada con un monitor de progreso aadido, que monitoriza la lectura
desde el stream. Se utiliza un ejemplar de este stream como cualquier otro stream. Se
puede obtener el monitor de progreso del stream llamando a getProgressMonitor y
configurndolo como se describe en Cmo usar Progress Monitors.

Despus de ver una barra de progreso y un monitor de progreso en accin, Decidir si utilizar
una Barra o un Monitor de Progreso puede ayudarnos a decidir cul es el apropiado para
nuestra aplicacin.

Tcnica de Programacin Orientada a Objetos

118

JFileChooser

JFileChooser es una clase java que nos permite mostrar fcilmente una ventana para la
seleccin de un fichero.
Si queremos abrirlo para leer el fichero, podemos llamarlo as

JFileChooser fileChooser = new JFileChooser();


int seleccion = fileChooser.showOpenDialog(areaTexto);

A la vuelta, en seleccion tendremos


JFileChooser.CANCEL_OPTION Si el usuario le ha dado al botn cancelar.
JFileChooser.APPROVE_OPTION Si el usuario le ha dado al botn aceptar
JFileCHooser.ERROR_OPTION Si ha ocurrido algn error.
Comprobando que se ha dado al botn aceptar, podemos obtener el fichero seleccionado por
el usuario as

if (seleccion == JFileChooser.APROVE_OPTION){
File fichero = fileChooser.getSelectedFile();
// Aqu debemos abrir y leer el fichero.
...
}
Para seleccionar un fichero para guardar datos, el mecanismo es igual, pero se llama al mtodo
showSaveDialog()

JFileChooser fileChooser = new JFileChooser();


int seleccion = fileChooser.showSaveDialog(areaTexto);
if (seleccion == JFileChooser.APPROVE_OPTION){
File fichero = fileChooser.getSelectedFile();
// Aqu debemos abrir el fichero para escritura
// y salvar nuestros datos.
...
}

La nica diferencia entre uno y otro es la etiqueta del dilogo y de los botones. Uno pondr
"Abrir" y otro "Guardar"

Filtrar los ficheros visibles


Si no queremos que el JFileChooser muestre todos los ficheros del directorio, podemos
aadirle un filtro. Bsicamente hay que hacer una clase que herede de FileFilter y definir el
mtodo accept(). Este mtodo recibe un parmetro File y nosotros debemos decidir si pasa o
no el filtro, devolviendo true o false. Por ejemplo, si slo queremos ver fichero .jpg, podemos
hacer este filtro.

Tcnica de Programacin Orientada a Objetos

119

Import javax.swing.filechooser.FileFilter;
...
public class FiltroDeJPG extends FileFilter{
public boolean accept (File fichero) {
if (tieneExtensionJPG (fichero))
return true;
else
return false;
}
public String getDescription() {
return ("Filtro JPGs");
}
}

Debemos definir ambos mtodos. La descripcin puede ser cualquier cadena de texto que nos
sirva como descripcin del filtro. Finalmente, debemos pasar este filtro al JFileChooser
fileChooser.setFilter(new FiltroDeJPG());
Sin embargo, una de las bondades ofrecidas por el JDK 1.6, es el ahorro en la codificacin de
una clase filtro, pues este, ya viene con una incluida a la cual solo necesitamos invocarla, la
sintaxis es la siguiente:

JFileChooser jf = new JFileChooser();


FileNameExtensionFilter filter = new
FileNameExtensionFilter("JPG & GIF", "jpg", "gif");
jf.setFilter(filter);

Tenes definir un FileFilter , es decir, creas una clase que herede de FileFilter y le das las
propiedades que deseas. Por ejemplo:

JFileChooser chooser = new JFileChooser();


ExampleFileFilter filter = new ExampleFileFilter();
File fichero = null;
filter.addExtension("txt");
filter.addExtension("bat");
filter.setDescription("Ficheros de texto");
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(this);
if(returnVal == JFileChooser.APPROVE_OPTION)
fichero = chooser.getSelectedFile();

Tcnica de Programacin Orientada a Objetos

120

Si queres trabajar con directorios tenes que cambiar el modo de seleccin usando la constante
JFileChooser.DIRECTORIES_ONLY. El modo de seleccin tambin puede ser cambiado para
permitir elegir mas de un fichero o directorio a la vez:

chooser.setFileSelectionMode(JFileChooser.DIRECTOR IES_ONLY);

Tcnica de Programacin Orientada a Objetos

121

JInternalFrame

Con la clase JInternalFrame, se puede mostrar un JFrame - como una ventana dentro de otra
ventana. Para crear un frame interno que parezca un dilogo sencillo, se pueden utilizar los
mtodos showInternalXxxDialog de JOptionPane, como se explic en Cmo crear Dilogos.
Normalmente, los frames internos se muestran dentro de un JDesktopPane.
JDesktopPane es una subclase de JLayeredPane al que se le ha aadido el API para manejar
el solapamiento de mltiples frames internos. Generalmente, se pone el panel superior dentro
del panel de contenido de un JFrame.

public class Frame1 extends JFrame {


private JDesktopPane jDesktopPane1 = new JDesktopPane();
private JInternalFrame hija1 = new JInternalFrame();
private JDesktopPane jDesktopPane2 = new JDesktopPane();
private JInternalFrame hija2 = new JInternalFrame();

private void jbInit() throws Exception {


.
jDesktopPane1.add(hija1, null);
jDesktopPane2.add(hija2, null);
Tcnica de Programacin Orientada a Objetos

122

hija1.getContentPane().setLayout(null);
hija2.getContentPane().setLayout(null);
hija1.setVisible(true);
hija2.setVisible(true);
}
}
Para poder visualizar las ventanas u ocultarlas podra usar el metodo setVisble true o false en el
momento que usted desee ver la ventana deseada.

Tcnica de Programacin Orientada a Objetos

123

Implementacin de Libreras
En la mayora de los sistemas operativos actuales, se ofrece una cantidad de cdigo para
simplificar la tarea de programacin. Este cdigo toma la forma, normalmente, de un conjunto
de libreras dinmicas que las aplicaciones pueden llamar cuando lo necesiten. Pero la
Plataforma Java est pensada para ser independiente del sistema operativo subyacente, por lo
que las aplicaciones no pueden apoyarse en funciones dependientes de cada sistema en
concreto. Lo que hace la Plataforma Java, es ofrecer un conjunto de libreras estndar, que
contiene mucha de las funciones reutilizables disponibles en los sistemas operativos actuales.
Las libreras de Java tienen tres propsitos dentro de la Plataforma Java. Al igual que otras
libreras estndar, ofrecen al programador un conjunto bien definido de funciones para realizar
tareas comunes, como manejar listas de elementos u operar de forma sofisticada sobre
cadenas de caracteres. Adems, las libreras proporcionan una interfaz abstracta para tareas
que son altamente dependientes del hardware de la plataforma destino y de su sistema
operativo. Tareas tales como manejo de las funciones de red o acceso a ficheros, suelen
depender fuertemente de la funcionalidad nativa de la plataforma destino. En el caso concreto
anterior, las libreras java.net y java.io implementan el cdigo nativo internamente, y ofrecen
una interfaz estndar para que aplicaciones Java puedan ejecutar tales funciones. Finalmente,
no todas las plataformas soportan todas las funciones que una aplicacin Java espera. En
estos casos, las libreras bien pueden emular esas funciones usando lo que est disponible, o
bien ofrecer un mecanismo para comprobar si una funcionalidad concreta est presente.

Creacin de Archivos Jar Ejecutable


Los ejecutables en JAVA, no son ".exe", debemos tomar esto en cuenta. Pues si fueran .exe
solo funcionaran en Windows, y como JAVA es multiplataforma, es por ello que tiene otra
forma de ejecutar sus archivos.
No requieren de un IDE para ejcutarse, el IDE, lo unico que hace es probar si todo funciona
correctamente, y ejecutarle en tiempo de desarrollo del programa, pero no para produccin.
Los programas en JAVA, para ser ejecutados pasan por dos procesos, uno de compilacin (o
pseudo compilacin) y otro de interpretacin (que es en si la ejecucin), la compilacin es para
convertir el cdigo fuente (.java) en (.class) de esa manera se obtienen un archivo
independiente de la plataforma. Que puede ser distribuido incluso por la red, por su ligero
tamao. (por eso decimos que JAVA es un lenguaje de red).
El proceso de Interpretacin lo hace el JRE (java runtime engine), ayudado claro, con el
plugin, que esta preinstalado en el sistema operativo. El JRE, es independiente de la
plataforma tambien, pero el plugin, si es dependiente de la plataforma (Sistema operativo), pero
como este plugin viene desde fbrica, entonces, es transparente para nosostros.
Si quieres tener un archivo ejecutable de JAVA, siempre tendra que seguir estos dos pasos,
compilar y ejecutarse(interpretarse).
Si es windows, creas un BAT, y si es linux, creas un SCRIPT, que te haga las veces de
"ejecutor".
Si no quieres esa manera, tienes otra forma ms estndar, por el lado de JAVA, tenemos a los
archivos ".jar", que son archivos que pueden compimir a un conjunto de clases JAVA, y que
pueden ser ejecutados por los Sistemas operativos, si tiene una clase ocn un mtodo "main"

Tcnica de Programacin Orientada a Objetos

124

Pasos para crear el Jar (datos comprimidos)


1. Apertura su aplicacin que desee crear como ejecutable:
2. Luego sleccionar con click derecho el proyecto
3. Elegir new y aparecer esta ventana(seguir los 4 pasos)

1
1

3
3

4
3
4. Luego establecer el nombre del archivo Ejecutable

5. Al darle aceprtar aparecer esta ventana donde deber de elegir la clase que ejecute la
aplicacin (clase Main), busque la clase.

Tcnica de Programacin Orientada a Objetos

125

6. El nombre se establecera en el main Class de la ventana

Tcnica de Programacin Orientada a Objetos

126

Contenidos

Threads
____________________________________________________________________________

Una thread es un nico flujo de contrrol dentro de un programa. Algunnaas veces es llammado
contexto de ejecucin porque cada thread debe tenner sus propios recurssos, como el
prrogram counter y el stack de ejecucin, como el contexto dee ejecucin. Sin embargo, toda
thread en un programa aun comparte muchos recursos, tales como espacio de memoria y
archivvos abiertos. Threads tambien son llamadas procesos livianos (lightweight prrocess).

Comparticin de datos
Todos los hilos de proceso que pertenecen a un mismo proceso comparten un rea comn de
datos que sirve para intercambiar informacin entre ellos. No es necesario acudir a tcnicas de
comunicacin entre procesos tales como paso de mensajes, ya que todos los hilos son
capaces de acceder directamente a los datos compartidos.
Por otro lado, la conmutacin entre hilos de un mismo proceso es muy rpida, puesto que la
cantidad de informacin que ha de ser salvada y/o restaurada por el sistema es mucho menor.
Por eso, cuando se trata con hilos siempre se habla de cambios de contexto ligeros, en
contraposicin a los cambios de contexto pesados, que implican el manejo de procesos.

Tcnica de Programacin Orientada a Objetos

127

Ejemplo 01

Crear una Aplicacin que presente la hora del sistema usando hilos.

public class PanelReloj extends JPanel{


JLabel reloj;
public PanelReloj(){
reloj= new JLabel("", JLabel.CENTER);
reloj.setForeground(Color.blue);
reloj.setFont(new Font("Arial", Font.BOLD, 30));
add(reloj, BorderLayout.CENTER);
MiReloj hilo= new MiReloj(reloj);
hilo.start();
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}
}

public class MiReloj extends Thread{


JLabel lblReloj;
// constructor
public MiReloj(JLabel lblReloj){
this.lblReloj= lblReloj;
}
// puesta en marcha del hilo
public void run() {
while(true)
{
Date hoy= new Date();
SimpleDateFormat sdf= new SimpleDateFormat("hh:mm:ss");
lblReloj.setText(sdf.format(hoy));
try { sleep(1000); } catch (Exception ex) {}
}
}
}

Tcnica de Programacin Orientada a Objetos

128

public class CFrmP extends JFrame{


public static void main(String[] arg){
CFrmP ver = new CFrmP ();
PanelReloj panel = new PanelReloj();
ver.setContentPane(panel);
ver.setSize(250,100);
ver.setLocationRelativeTo(null);
ver.setVisible(true);
}
}

Ejemplo 02
crear el Panel por medio de Codigo: Solo inserte el panel y digite los siguiente, crea una
clase main y una subclase.
public class PanelCarrera extends JPanel implements ActionListener{
public JLabel lblJ1 = new JLabel("1",JLabel.CENTER);
public JLabel lblJ2 = new JLabel("2",JLabel.CENTER);
JLabel barrera=new JLabel();
JButton b= new JButton("Inicia carrera");
//Constructor
public PanelCarrera(){
setLayout(new BorderLayout());
JPanel p= new JPanel();
p.setLayout(null);
lblJ1.setBounds(0,25, 20,20);
lblJ1.setBackground(Color.blue);
lblJ1.setOpaque(true);
lblJ1.setForeground(Color.white);
lblJ2.setBounds(0,50, 20, 20);
lblJ2.setBackground(Color.red);
lblJ2.setOpaque(true);
lblJ2.setForeground(Color.white);
barrera.setBounds(310,0, 2,400);
barrera.setBackground(Color.green);
barrera.setOpaque(true);
b.addActionListener(this);
p.add(lblJ1);
p.add(lblJ2);

Tcnica de Programacin Orientada a Objetos

129

p.add(barrera);
add(p, BorderLayout.CENTER);
add(b, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e){
lblJ1.setLocation(0, lblJ1.getLocation().y);
lblJ2.setLocation(0, lblJ2.getLocation().y);
ClassCarreraHilo st1= new ClassCarreraHilo(lblJ1, this);
ClassCarreraHilo st2= new ClassCarreraHilo(lblJ2, this);
st1.start();
st2.start();
}
}

// creacin de la clase Hilo


class ClassCarreraHilo extends Thread{
JLabel eti;
PanelCarrera p;
//contructor de la clase
public ClassCarreraHilo(JLabel eti, PanelCarrera p){
this.eti=eti;
this.p= p;
}
// meto de inicializacion de la clase Threads
public void run() {
int c1, c2;
while(true){
//usando un un Try
try {
//usando sleep de la clase threads
sleep((int)(Math.random() * 1000));
c1= p.lblJ1.getLocation().x;
c2= p.lblJ2.getLocation().x;
if(c1<290 && c2<290){
eti.setLocation(eti.getLocation().x + 10, eti.getLocation().y);
//usando el panel
p.repaint();
}
else break;
} catch (InterruptedException e) {}
}

Tcnica de Programacin Orientada a Objetos

130

// determina el ganador si alguien lleg a la meta


if (eti.getLocation().x>=290)
if (c1>c2)
JOptionPane.showMessageDialog(null,"Gano 1");
else if (c2>c1)
JOptionPane.showMessageDialog(null,"Gano 2");
else
JOptionPane.showMessageDialog(null,"Empate");
}
}
// Usando el Jframe dentro de una clase con herencia de las propiedades del Frame
public class ClassFrmHiloJuego extends JFrame{
public static void main(String[] arg){
ClassFrmHiloJuego Carrera = new ClassFrmHiloJuego();
PanelCarrera panel = new PanelCarrera();
Carrera.setContentPane(panel);
Carrera.setSize(350,200);
Carrera.setTitle("Juego de 2 - Ganador Aleatorio - VER");
Carrera.setLocationRelativeTo(null);
Carrera.setVisible(true);
}
}

Tcnica de Programacin Orientada a Objetos

131

Ejemplo 03
Muestre la palabra SISEpuede cada cierto tiempo
public class ClassBlink implements Runnable {
Thread Blink=new Thread(this);
JLabel tiempo=new JLabel();
public ClassBlink() {
JFrame ventana = new JFrame("Visualizar Palabra");
ventana.setSize(250,100);
ventana.setVisible(true);
ventana.add(tiempo);
//Blink=new Thread(this);
Blink.start();
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}
public void run(){
try {
while(true){
tiempo.setText("Sise puede..");
Blink.sleep(1000);
tiempo.setText(" ");
Blink.sleep(1000);
}
} catch (InterruptedException ex) {
System.out.println("Error...");
}
}
public static void main(String[] args) {
new ClassBlink();
}
private void jbInit() throws Exception {
tiempo.setBackground(new Color(0, 0, 165));
tiempo.setForeground(new Color(247, 255, 214));
tiempo.setOpaque(true);
tiempo.setFont(new Font("Dialog", 1, 21));
}
}

Tcnica de Programacin Orientada a Objetos

132

Proyecto Final: Caso Practico.


Crear un Proyecto final donde aplique la Tecnica de programacin orientada a Objetos
(herencias, sobrecarga de mtodos, encapsulamiento), uso de mtodos, paneles establecer
archivos, uso de imgenes, hilo para el reloj activo, etc.
Todos los datos estarn guardados dentro de un Archivo llama Datos.txt
La estructura a trabajar seria:
Agregue al Proyecto una Interface llamada intImpleMetodoso en el Paquete pckInterface
donde defina todos los metodos a utilizar por el proyecto

Tcnica de Programacin Orientada a Objetos

133

Ademas Agregue 2 Frame en la capa Presentacion:


Para el Acceso de Usuario: Que estarn registrados dentro un Archivo.
Para el reporte de Datos: donde mostrara, el total de sueldos desembolsados por la
empresa, total de descuentos, aumentos y netos, cuantos tuvieron aumentos y cuantos
descuentos

Presentacin Final

Panel Encabezado

Panel Pie: use la Clase GregorianCalendar y Hilos

Panel Listado: usara el JFileChooiser para jalar la foto


Tcnica de Programacin Orientada a Objetos

134

El botn agregar solo almacenara datos al ArrayList, lo botones modificar, eliminar, depender
de la seleccin del JTable y buscar pedir el numero para mostrar todos los elementos en el
panel contenido.

Panel Contenido
Todos permitir mostrar todos los datos dentro del arrayList asi como aquellos que ya estaban
en el archivo.
X apellido: segn a las letras o palabra completa se realizar el filtro por apellidos en el Jtable.

Tcnica de Programacin Orientada a Objetos

135

Contenidos

Introduccin a la Plataforma .NET


o Componentes de la Plataforma .NET: NET Framework, Building Block
Services, Visual Studio .NET, .NET Enterprise Servers
o NET Framework: Beneficios. Lenguajes. Componentes: CLR, Class
Library, ADO.NET, ASP .NET, Web Forms, Windows Forms.
o Namespaces
o Entorno integrado de Visual Studio .NET 2005
Variables y Tipos de Datos
o Tipos de Datos. Conversin Explcita e Implcita de Tipos.
o Funciones de Conversin.
o Variables. mbito: Local, Privado y Pblico
o Estructuras. Creacin y Uso. Declaracin. Enumeraciones.
Diseo de Aplicaciones Windows en Visual Basic .NET 2005
o Windows Forms. Propiedades y Eventos.
o Controles Bsicos: TextBox, Label, Button. Propiedades y Eventos
o Eventos y Delegados. La palabra clave Handles

Introduccin a la Plataforma .NET


Si bien solemos tener la sensacin de que los paradigmas de programacin de tecnologas
Microsoft se encuentran en constante cambio, la realidad nos muestra que los grandes cambios
vienen ocurriendo aproximadamente cada 10 aos. Uno de ellos se dio a finales de la dcada
de 1990 y principios de la dcada del 2000, con el desarrollo y la introduccin al mercado de la
plataforma Microsoft .NET. Hubo varios factores que motivaron al desarrollo de esta plataforma,
entre los cuales podemos mencionar:
-

La amplia disponibilidad de conexiones a Internet de alta velocidad, e incluso


inalmbricas
La proliferacin de nuevos tipos de dispositivos de hardware que son usados en la vida
diaria (telfonos inteligentes, Pocket PCs, HandHelds, Media Centers, etc.)
El creciente poder de cmputo de las computadoras personales y servidores basados
en arquitecturas x86.
El surgimiento de estndares de Internet para permitir la comunicacin e integracin
entre diversas plataformas de software.

Tcnica de Programacin Orientada a Objetos

136

Que no es .NET?
Antes de decir qu es .NET, es conveniente aclarar qu NO es .NET:
.NET no es un sistema operativo, como si lo es Microsoft Windows en sus distintas
versiones.
.NET no es un Lenguaje de Programacin: si bien la plataforma Microsoft .NET incluye
lenguajes de programacin de aplicaciones, su concepto es ms amplio y va ms all
de stos.
.NET no es un Entorno de Desarrollo: si bien la plataforma Microsoft .NET incluye
entornos de desarrollo integrados (IDEs), su concepto es ms amplio y va ms all de
stos.
.NET no es un servidor de aplicaciones (Application Server)
.NET no es un producto empaquetado que se pueda comprar como tal, sino que es una
plataforma que engloba distintas aplicaciones, servicios y conceptos y que en conjunto
permiten el desarrollo y la ejecucin de aplicaciones.

Qu es .NET?
Plataforma de Desarrollo compuesta de

Entorno de Ejecucin (Runtime)


Bibliotecas de Funcionalidad (Class Library)
Lenguajes de Programacin
Compiladores
Herramientas de Desarrollo (IDE & Tools)
Guas de Arquitectura

La evolucin de la plataforma COM

Microsoft .NET es una plataforma de desarrollo y ejecucin de aplicaciones. Esto quiere decir
que no slo nos brinda todas las herramientas y servicios que se necesitan para desarrollar
modernas aplicaciones empresariales y de misin crtica, sino que tambin nos provee de
mecanismos robustos, seguros y eficientes para asegurar que la ejecucin de las mismas sea
ptima. Los componentes principales de la plataforma .NET son:
Un entorno de ejecucin de aplicaciones, tambin llamado Runtime, que es un
componente de software cuya funcin es la de ejecutar las aplicaciones .NET e
interactuar con el sistema operativo ofreciendo sus servicios y recursos.
Un conjunto de bibliotecas de funcionalidades y controles reutilizables, con una enorme
cantidad de componentes ya programados listos para ser consumidos por otras
aplicaciones.
Un conjunto de lenguajes de programacin de alto nivel, junto con sus compiladores y
linkers, que permitirn el desarrollo de aplicaciones sobre la plataforma .NET.
Un conjunto de utilitarios y herramientas de desarrollo para simplificar las tareas ms
comunes del proceso de desarrollo de aplicaciones.

Documentacin y guas de arquitectura, que describen las mejores prcticas de diseo,


organizacin, desarrollo, prueba e instalacin de aplicaciones .NET

Tcnica de Programacin Orientada a Objetos

137

Componentes de la Plataforma .NET


Las tecnologas intrnsecas que integran la plataforma .NET incluyen:

NET Framework
El .NET Framework se basa en un nuevo entorno de ejecucin de lenguaje comn
(CLR - Common Language Runtime). Este motor de ejecucin proporciona un conjunto
de servicios comunes para los proyectos generados en Visual Studio .NET, con
independencia del lenguaje. Estos servicios proporcionan bloques de desarrollo
fundamentales para aplicaciones de cualquier tipo, para todas las capas y niveles de la
arquitectura de aplicaciones.

Servicios .NET Building Blocks


Los servicios .NET Building Block son servicios programables distribuidos que estn
disponibles tanto en modo conectado como desconectado. Un servicio puede invocarse
desde un ordenador aislado no conectado a Internet, ofrecido por un servidor local
dentro de una empresa, o puede ser accedido a travs de Internet. Los servicios .NET
Building Blocks pueden utilizarse desde cualquier plataforma que soporte el protocolo
SOAP. Los servicios pueden incluir identidad, notificacin y mensajera,
personalizacin, almacenamiento esquematizado, calendario, directorio, bsqueda y
distribucin de software.

Visual Studio .NET


Visual Studio .NET ofrece un entorno de desarrollo de alto nivel para desarrollar
aplicaciones que se ejecutan sobre el .NET Framework. Proporciona las tecnologas
fundamentales para simplificar la creacin, implantacin y evolucin constante de
aplicaciones y Servicios Web seguros, escalables y de alta disponibilidad. Tambin
permite crear una nueva generacin de aplicaciones basadas en Windows con
numerosas y nuevas caractersticas disponibles gracias al .NET Framework.

Servidores .NET Enterprise Servers


Los servidores .NET Enterprise Servers proporcionan escalabilidad, fiabilidad, gestin e
integracin dentro de la empresa y entre organizaciones, tales como Microsoft SQL
Server 2005.

Tcnica de Programacin Orientada a Objetos

138

NET FRAMEWORK

El .NET Framework proporciona todos los servicios comunes necesarios para ejecutar las
aplicaciones Visual Basic .NET.

Crear componentes en el .NET Framework


Antes del modelo COM, las aplicaciones estaban formadas por entidades totalmente separadas
con poca o ninguna integracin. Al utilizar COM, es posible integrar componentes dentro de
una aplicacin y entre aplicaciones exponiendo una serie de interfaces comunes. Sin embargo,
todava es necesario que los desarrolladores escriban el cdigo para envolver, gestionar e
integrar componentes y objetos. En el .NET Framework, los componentes se construyen sobre
una base comn. Ya no es necesario escribir cdigo para permitir que los objetos interacten
directamente entre s. En el entorno .NET, ya no es necesario escribir envoltorios de
componentes, puesto que los componentes no los utilizan. El .NET Framework puede
interpretar las construcciones a los que los desarrolladores estn acostumbrados utilizando
lenguajes orientados a objetos. El .NET Framework soporta totalmente clases, herencia,
mtodos, propiedades, eventos, polimorfismo, constructores y otras construcciones orientadas
a objetos.

Common Language Specification


La especificacin Common Language Specification (CLS) define los mnimos estndares que
deben satisfacer los lenguajes y desarrolladores si desean que sus componentes y
aplicaciones sean ampliamente utilizados por otros lenguajes compatibles con .NET. La
especificacin CLS permite a los desarrolladores de Visual Basic .NET crear aplicaciones como
parte de un equipo que utiliza mltiples lenguajes con la seguridad de que no habr problemas
con la integracin de los diferentes lenguajes. La especificacin CLS tambin permite a los
desarrolladores de Visual Basic .NET heredar de clases desarrolladas en lenguajes diferentes.

Tcnica de Programacin Orientada a Objetos

139

Visual Studio .NET


En el .NET Framework, Visual Studio .NET ofrece las herramientas que permiten el desarrollo
rpido de aplicaciones.

1. Beneficios
El .NET Framework fue diseado para satisfacer los siguientes objetivos:
Basado en estndares y prcticas Web
El .NET Framework soporta totalmente las tecnologas existentes de Internet, incluyendo
Hypertext Markup Language (HTML), XML, SOAP, Extensible Stylesheet Language for
Transformations (XSLT), Xpath y otros estndares Web. El .NET Framework promueve la
creacin de servicios Web dbilmente conectados y sin estado.

Extensible

La jerarqua del .NET Framework no queda oculta al desarrollador. Podemos acceder y


extender clases .NET (a menos que estn selladas) utilizando herencia. Tambin podemos
implementar herencia multi-lenguaje.

Fcil de usar por los desarrolladores

En el .NET Framework, el cdigo est organizado en espacios de nombres jerrquicos y


clases. El Framework proporciona un sistema de tipos comn, denominado sistema de
tipos unificado, que utiliza cualquier lenguaje compatible con .NET. En el sistema de tipos
unificado, todo es un objeto. No existen tipos variant, slo hay un tipo de cadena (string), y
todos los datos de la cadena son Unicode.

Diseado utilizando modelos de aplicaciones unificados

La funcionalidad de una clase .NET est disponible desde cualquier modelo de


programacin o lenguaje compatible con .NET.

Tcnica de Programacin Orientada a Objetos

140

2. Lenguajes
La plataforma .NET es independiente del lenguaje (el .NET Framework proporciona
todos los servicios comunes necesarios para permitir la ejecucin de los programas). El
.NET Framework ofrece soporte para numerosos lenguajes de programacin,
incluyendo lenguajes de Microsoft y de terceros.

Microsoft Visual Basic .NET

Visual Basic .NET ofrece importantes innovaciones del lenguaje respecto a versiones
anteriores de Visual Basic. Visual Basic .NET soporta herencia, constructores,
polimorfismo, sobrecarga, excepciones estructuradas, estricta verificacin de tipos, free
threading, y muchas otras caractersticas. En esta versin, Visual Basic Scripting
Edition proporciona funcionalidad completa Visual Basic.

Microsoft Visual C#

C# ha sido diseado especficamente para la plataforma .NET y es el primer lenguaje


moderno orientado a componentes de la familia de C y C++. Puede incrustarse en
pginas ASP.NET. Algunas de las principales caractersticas de este lenguaje incluyen
clases, interfaces, delegados, boxing y unboxing, espacios de nombres, propiedades,
indexadores, eventos, sobrecarga de operadores, versionado, atributos, cdigo
inseguro, y la creacin de documentacin en formato XML. No son necesarios archivos
de cabecera ni archivos IDL (Interface Definition Language).

Extensiones gestionadas C++

La actualizacin de Visual C++ es una mnima extensin gestionada del lenguaje C++.
Esta extensin proporciona acceso al .NET Framework incluyendo el recolector de
basura, herencia de implementacin simple y herencia de interfaz mltiple. Esta
actualizacin tambin elimina la necesidad de escribir cdigo de fontanera para los
componentes. Ofrece acceso a bajo nivel donde sea necesario.

Microsoft J#

J# .NET es un lenguaje para los desarrolladores que utilicen el lenguaje Java que
quieran generar las aplicaciones y servicios para el .NET Framework. J# .NET est
totalmente integrado con el IDE de Visual Studio .NET y est diseado para aprovechar
al mximo el .NET Framework.

Lenguajes de terceros

Varios lenguajes de terceros soportan la plataforma .NET. Estos lenguajes incluyen


APL, COBOL, Pascal, Eiffel, Haskell, ML, Oberon, Perl, Python, Scheme y SmallTalk.

Tcnica de Programacin Orientada a Objetos

141

3. Componentes
Los componentes principales del .NET Framework son los siguientes:

Common Language Runtime - CLR


Biblioteca de clases del .NET Framework
ADO.NET: datos y XML
ASP.NET: Formularios Web y Servicios Web
Interfaz de usuario

3.1.

COMMON LANGUAGE RUNTIME

El CLR (Common Language Runtime) simplifica el desarrollo de aplicaciones,


proporciona un entorno de ejecucin robusto y seguro, soporta mltiples lenguajes,
simplifica la implantacin y administracin de aplicaciones y proporciona un entorno
gestionado.

Tcnica de Programacin Orientada a Objetos

142

Qu es un entorno gestionado?
Un entorno gestionado es aquel que proporciona servicios comunes de forma
automtica. Algunos ejemplos de los tipos de servicios que proporciona un entorno
gestionado son el recolector de basura y la seguridad.

Componentes del Common Language Runtime


La siguiente tabla describe las caractersticas del Common Language Runtime.

3.2. CLASS LIBRARY


La biblioteca de clases del .NET Framework expone caractersticas del entorno de
ejecucin y proporciona en una jerarqua de objetos otros servicios de alto nivel que
todo programador necesita. Esta jerarqua de objetos se denomina espacio de
nombres.

Tcnica de Programacin Orientada a Objetos

143

Espacios de nombres System


El espacio de nombres System contiene clases fundamentales y clases base que
definen tipos de datos valor y referencia comnmente utilizados, eventos y descriptores
de eventos, interfaces, atributos y procesamiento de excepciones. Otras clases
proporcionan servicios como la conversin de tipos de datos o la manipulacin de
parmetros de mtodos, operaciones matemticas, invocacin local y remota de
programas, administracin de los entornos de aplicaciones y la supervisin de
aplicaciones gestionadas y no gestionadas.

El espacio de nombre System.Collections proporciona listas clasificadas, tablas hash


y otras formas de agrupar datos. El espacio de nombres System.IO proporciona E/S de
archivos, flujos, etc. El espacio de nombres System.NET proporciona soporte de
Transmission Control Protocol/Internet Protocol (TCP/IP) y sockets. Si desea ms
informacin sobre los espacios de nombres, realice una bsqueda de espacio de
nombres en la documentacin del .NET Framework SDK.

3.3. ADO .NET Y XML


ADO.NET es la siguiente generacin de la tecnologa ActiveX Data Objects (ADO).
ADO.NET proporciona un soporte mejorado para el modelo de programacin
desconectado. Tambin ofrece un completo soporte de XML.

Espacio de nombres System.Data

El espacio de nombres System.Data est compuesto por clases que constituyen el


modelo de objetos ADO.NET. A alto nivel, el modelo de objetos ADO.NET se divide en
dos capas: la capa conectada y la capa desconectada. El espacio de nombres
System.Data incluye la clase DataSet, que representa mltiples tablas y sus
relaciones. Estos conjuntos de datos son estructuras de datos completamente
autocontenidas que pueden poblarse desde diversas fuentes de datos. Una posible

Tcnica de Programacin Orientada a Objetos

144

fuente de datos podra ser XML, otra podra ser OLE DB, y una tercera fuente de datos
podra ser el adaptador directo para SQL Server.

Espacio de nombres System.Xml

El espacio de nombres System.Xml proporciona soporte para XML. Incluye un


parseador y un escritor XML, siendo compatibles con el W3C. Las transformaciones las
proporciona el espacio de nombres System.Xml.Xsl y la implementacin de XPath que
permite navegacin de grafos de datos en XML. El espacio de nombres
System.XML.Serialization proporciona toda la infraestructura bsica para los Servicios
Web, incluyendo caractersticas como el movimiento atrs y adelante entre objetos y
una representacin XML.

3.4.

ASP.NET: WEB FORMS Y WEB SERVICES

ASP.NET es un marco de trabajo de programacin basado en el Common Language


Runtime y que puede ser utilizado en un servidor para crear potentes aplicaciones
Web. Los Formularios Web de ASP.NET proporcionan una forma fcil y potente de

Tcnica de Programacin Orientada a Objetos

145

generar interfaces de usuario (IUs) Web dinmicos. Los Servicios Web de ASP.NET
proporcionan las piezas para construir aplicaciones distribuidas basadas en la Web.
Los Servicios Web estn basados en estndares abiertos de Internet, como HTTP y
XML. Podemos pensar en un Servicio Web como un componente reutilizable accesible
a travs de Internet, en lugar de estar limitado a clientes Windows en una red de rea
local.
El Common Language Runtime proporciona un soporte nativo para crear y exponer
Servicios Web utilizando una abstraccin de programacin coherente y familiar para
desarrolladores tanto de Active Server Pages (ASP) como de Visual Basic. El modelo
resultante es escalable y extensible. Este modelo se basa en estndares abiertos de
Internet (HTTP, XML, SOAP y SDL) y, por tanto, puede ser accedido e interpretado
desde cualquier cliente o dispositivo habilitado para Internet. Algunas de las clases
ASP.NET ms habituales se describen en los siguientes prrafos.

Espacio de nombres System.Web


En el espacio de nombres System.Web, existen servicios como la gestin de cach,
seguridad, configuracin y otros que son compartidos por los Servicios Web y por el
interfaz de usuario (IU) Web.

Espacio de nombres System.Web.Services


El espacio de nombres System.Web.Services gestiona los requerimientos de los
Servicios Web como los protocolos de transporte y el descubrimiento de servicios.

Espacio de nombres System.Web.UI


El espacio de nombres System.Web.UI proporciona dos clases de controles: los
controles HTML y los controles Web. Los controles HTMLControl proporcionan un
mapeado directo de las etiquetas HTML, como <INPUT>. Existen tambin otros
controles WebControl ms ricos que permiten estructurar controles mediante plantillas
(por ejemplo, un control de rejilla).

3.5.

INTERFAZ DE USUARIO

Tcnica de Programacin Orientada a Objetos

146

Las aplicaciones Windows pueden ahora proporcionar interfaces de usuario ms


potentes que nunca utilizando los espacios de nombres System.Windows.Forms y
System.Drawing del .NET Framework. El aspecto de los nuevos formularios Windows
Forms de .NET resultar muy familiar para los desarrolladores de Visual Basic.

Espacio de nombres System.Windows.Forms Podemos utilizar las clases del


espacio de nombres System.Windows.Forms para crear el IU cliente. Esta clase nos
permite implementar el IU de Windows estndar en nuestras aplicaciones .NET.
Muchas funciones a las que anteriormente slo podan accederse mediante llamadas a
la API (Application Programming Interface) estn ahora disponibles como parte de los
propios formularios, lo cual hace el desarrollo mucho ms fcil y potente.

Espacio de nombres System.Drawing El espacio de nombres System.Drawing


proporciona acceso a la funcionalidad de grficos bsica de GDI+. Los espacios de
nombres
System.Drawing.Drawing2D,
System.Drawing.Imaging
y
System.Drawing.Text ofrecen funcionalidades ms avanzadas.

Tcnica de Programacin Orientada a Objetos

147

NAMESPACES
.NET Framework incluye un gran conjunto de ensamblados que forman las bibliotecas de
clases, que conjuntamente contienen cientos de tipos. Estos ensamblados proporcionan
acceso a funcionalidades del sistema en nuestro proceso de desarrollo.

Objetivo de los espacios de nombres


Debido a que la biblioteca de clases del .NET Framework incluye definiciones para numerosos
tipos, la biblioteca se organiza en un espacio de nombres de estructura jerrquica.

Los espacios de nombres utilizan un esquema nombres con una sintaxis basada en un punto
para agrupar lgicamente clases relacionadas de modo que puedan buscarse y reverenciarse
fcilmente. Por ejemplo, el espacio de nombres System.Data contiene clases que constituyen
la arquitectura de ADO.NET. El espacio de nombres System.Xml es el espacio de nombres
global para todas las clases XML que proporcionan soporte basado en estndares para
procesar XML.

El espacio de nombres System


El espacio de nombres System es el espacio de nombres raz para los tipos en el .NET
Framework. El espacio de nombres System contiene el tipo base Object, desde el que se
derivan otros tipos.

El espacio de nombres System tambin contiene tipos para la gestin de excepciones,


recolector de basura, E/S de consola, varios tipos de herramientas, tipos de datos de formato,
generadores de nmeros aleatorios y funciones matemticas.

Introduccin a los Tipos de Datos

El tipo de datos de un elemento de


programacin hace referencia a la clase de
datos que puede contener y a cmo se
almacenan los datos. El sistema de tipos
comunes (Common Type System CTS)
define los tipos de datos que soporta el
Common Language Runtime. Visual Basic
.NET utiliza tipos de datos que se
corresponden directamente con los tipos de
datos del sistema de tipos comunes.

Tcnica de Programacin Orientada a Objetos

148

Qu es el sistema de tipos comunes?

El sistema de tipos comunes define cmo se declaran, utilizan y gestionan los tipos en el
Common Language Runtime. Cada tipo de datos utilizado en Visual Basic .NET corresponde
directamente a un tipo definido en el sistema de tipos comunes.

Ventajas del sistema de tipos comunes


El sistema de tipos comunes tiene una gran importancia en la creacin de aplicaciones para la
plataforma Microsoft .NET. Hace posible que un desarrollador pueda crear un proyecto en
Visual Basic .NET e integrarlo con un componente creado por otro desarrollador en Microsoft
Visual C# y una funcin escrita por un tercer desarrollador en otro lenguaje compatible con
.NET. Todas estas piezas pueden integrarse en una nica solucin. Los compiladores y
herramientas de Microsoft Visual Studio .NET y el Common Language Runtime dependen del
sistema de tipos comunes para proporcionar:

Integracin entre lenguajes.

Cdigo con seguridad de tipos, lo que significa que nicamente se accede a los tipos de forma
permisible y bien definida.
Las herramientas que gestionan y permiten una ejecucin del cdigo de alto rendimiento.

Tipo valor vs. Tipo referencia

El sistema de tipos comunes soporta dos categoras generales de tipos: tipos valor y tipos
referencia.
Una variable de tipo valor contiene directamente sus datos. Cada variable de tipo valor tiene su
propia copia de datos, de modo que las operaciones en una variable de tipo valor no pueden
afectar a otra variable.
Una variable de tipo referencia contiene una referencia o puntero al valor de un objeto. Dos
variables de tipo referencia pueden referirse al mismo objeto, de modo que las operaciones en

Tcnica de Programacin Orientada a Objetos

149

una variable de tipo referencia pueden afectar al objeto referenciado por otra variable de tipo
referencia.

Tipos de datos
.NET Framework

VB .NET

C#

Descripcin

Boolean

Boolean

bool

True / false

Byte

Byte

byte

0 a 255

Int16

Short

short

-32768 a 32767

Int32

Integer

int

-2147483648 a

2147483647
Int64

Long

long

-10 E19 a 10 E19

Single

Single

float

-10 E38 a 10 E38

Double

Double

double

-10 E308 a 10 E308

Decimal

Decimal

decimal

-10 E28 a 10 E28

DateTime

Date

System.DateTime

1/1/0001 a 31/12/9999

String

String

string

Char

Char

char

Object

Object

object

Sbyte

SByte

sbyte

-128 a 127

UInt16

UShort

ushort

0 a 65535

UInt32

UInteger

uint

0 a 4.294.967.295

UInt64

ULong

ulong

0 a 1.8 E19

A estos tipos de datos se les conoce como TIPOS PRIMITIVOS.

Los TIPOS PRIMITIVOS forman parte del CTS (COMMON TYPE LANGUAGE). Los
ltimos tipos de datos forman parte del CTS pero no del CLS (COMMON LANGUAGE
SPECIFICATION), y no deben ser usados si se desea crear aplicaciones que
interoperen con otros lenguajes de .NET.

Cuando a una variable a la que se le ha asignado un valor, sobrepasa el rango tolerado


se dice que ocurre un ERROR DE DESBORDAMIENTO (OVERFLOW).

Tcnica de Programacin Orientada a Objetos

150

Cmo escoger un tipo de dato

Visual Basic no requiere que seleccione explcitamente un tipo de datos cuando declara una
variable. Sin embargo, es una buena idea hacerlo, ya que de esta forma sus aplicaciones sern
ms fiables y requerirn menos memoria. El tipo de datos determina los valores permitidos para
una variable, que, a su vez, determinan las operaciones que pueden realizarse sobre esa
variable.

Seleccionar un tipo de datos


Puede seguir las directrices generales que se muestran en la ilustracin anterior para
seleccionar el tipo de datos adecuado para una variable.

Tipado fuerte
Si usted declara variables sin tipo de datos, se les otorga de forma predeterminada el tipo de
datos Object. Esto facilita la escritura rpida de programas, pero puede hacer que stos se
ejecuten ms lentamente. La especificacin de tipos de datos para todas sus variables se
denomina tipado fuerte. Se recomienda el uso de tipado fuerte porque:

Minimiza la cantidad de memoria que utiliza la aplicacin.


Permite al compilador realizar la verificacin de tipos. Este proceso detecta las
instrucciones que pueden fallar en tiempo de ejecucin debido a variables y valores
que no concuerdan.
La ejecucin del cdigo es ms rpida.
Permite el soporte de Microsoft IntelliSense en sus variables. Esta tecnologa permite
ver sus propiedades y dems miembros mientras escribe el cdigo.

Tcnica de Programacin Orientada a Objetos

151

Uso de variables

Antes de que pueda utilizar una variable en su aplicacin, necesita nombrar, declarar la
variable y asignarle un valor.

Qu son las variables?

A menudo, cuando realizamos clculos en Visual Basic necesitamos almacenar valores


temporalmente. Por ejemplo, es posible que necesitemos calcular varios valores, compararlos y
realizar diferentes operaciones con ellos dependiendo del resultado de la comparacin.

Utilizamos variables para almacenar valores que pueden cambiar cuando una aplicacin se
est ejecutando.

Tcnica de Programacin Orientada a Objetos

152

Elementos de las variables


Una variable tiene los seis elementos siguientes:

Elemento

Descripcin

Nombre

La palabra que utilizamos para hacer referencia a la variable en cdigo.

Direccin

La ubicacin de memoria donde se almacena el valor de la variable.

Tipo de datos

El tipo y tamao inicial de datos que la variable puede almacenar.

Valor

El valor en la direccin de la variable.

mbito

El conjunto de todo el cdigo que puede acceder y utilizar la variable.

Tiempo de vida

El intervalo de tiempo durante el cual una variable es vlida y est


disponible para poder ser utilizada. Su valor puede cambiar durante
su vida, pero siempre mantiene alguno mientras existe en memoria.

Ejemplos de variables
Una variable puede utilizarse de muchas formas, incluyendo las siguientes:
Como contador que almacena el nmero de veces en que un evento se produce
Como almacenamiento temporal para valores de propiedades
Como ubicacin para guardar un valor de retorno de una funcin
Como ubicacin para almacenar nombres de directorio o archivos

Cmo nombrar las variables

Cuando declaramos una variable, es importante desarrollar una estrategia de asignacin de


nombres. Tanto la claridad como la coherencia son importantes, especialmente cuando otros
necesitarn leer o mantener nuestro cdigo.

Tcnica de Programacin Orientada a Objetos

153

Reglas
Cuando nombramos una variable en Visual Basic .NET, debemos tener en cuenta las
siguientes reglas:
Iniciar cada nombre de variable con un carcter alfabtico o un guin bajo (_).
No utilizar espacios ni smbolos.
No utilizar palabras clave como Integer o Date.

Recomendaciones
Se recomienda que tenga en cuenta las siguientes directrices cuando nombre variables:
Proporcione nombres descriptivos y con significado, como numeroCuenta.
Aunque escribir un nombre largo de variable puede resultar tedioso en el momento de
escribir cdigo, har que el cdigo sea ms fcil de leer y mantener.
Inicie cada palabra del nombre de una variable pblica con letra mayscula, como
NombreCliente. Esto se denomina PascalCasing.
Evite el uso de abreviaturas.
Aunque es posible utilizar un nombre de variable como nocta, el cdigo ser mucho
ms fcil de leer si utilizamos el nombre numeroCuenta. En caso de ser necesario el
uso de abreviaturas, debemos asegurarnos de que sean coherentes en toda la
aplicacin.
Utilice un nombre nico dentro del mbito de la variable. mbito (scope) hace
referencia al subconjunto del cdigo que reconoce la variable.
Cuando declare variables locales y privadas, inicie la primera palabra con un carcter
en minscula, como en nuevoCliente. Esto se denomina camelCasing.

Cmo declarar variables

Tcnica de Programacin Orientada a Objetos

154

Introduccin

Declaramos una variable para especificar su nombre y caractersticas. La instruccin de


declaracin tanto para variables de tipo valor como de tipo referencia es la instruccin Dim. La
ubicacin y el contenido de la declaracin determinan las caractersticas de la variable.
Sintaxis
Para declarar una variable, utilice la siguiente sintaxis:

Dim nombreVariable As Type


Utilizamos la instruccin Dim para declarar y asignar espacio de almacenamiento para
variables en bloques, procedimientos, mdulos, estructuras y clases. Utilizamos la clusula As
en la instruccin Dim para especificar el tipo de datos de la variable.

Nota La palabra clave Dim es una abreviatura de la palabra dimensin.

Ejemplos de tipos valor


Los siguientes ejemplos muestran cmo declarar las variables con tipos valor predefinidos:

Dim numberBooks As Integer


Dim squareFootage As Single

Ejemplos de tipos referencia

Los siguientes ejemplos muestran cmo declarar las variables con tipos referencia:

Dim myForm As Form


Dim userInput As String

Tcnica de Programacin Orientada a Objetos

155

Aunque la sintaxis para declarar variables de tipo valor y de tipo referencia es similar, el
entorno de ejecucin los gestiona de modo distinto. Una variable de tipo referencia siempre
contiene un puntero a un valor de ese tipo o una referencia nula. Una variable de tipo valor
contiene el valor real de la variable.

Cmo afecta Option Explicit a las variables

Introduccin
En general, debera declarar explcitamente las variables de su aplicacin antes de utilizarlas.
De este modo, se reduce la probabilidad de errores lgicos y se facilita el mantenimiento del
cdigo. Aunque no es recomendable, puede utilizar variables en su aplicacin sin antes
declararlas. Este proceso se denomina declaracin implcita.

Cmo funciona Option Explicit


Cuando Option Explicit est On (de forma predeterminada est habilitado), debe declarar
explcitamente variables antes de poder utilizarlas, de lo contrario el compilador generar un
error. Cuando Option Explicit no est habilitado (Off), puede declarar implcitamente una
variable simplemente utilizndola en su cdigo. Se crear como un tipo objeto. Aunque puede
resultar conveniente declarar variables implcitamente, se incrementa la probabilidad de
conflictos de nombres y de un comportamiento imprevisto debido a errores de ortografa.
Adems, genera un uso ineficaz del almacenamiento de memoria.

Tcnica de Programacin Orientada a Objetos

156

Ejemplo de una ventaja de Option Explicit

Por ejemplo, supongamos que la variable sueldoActual guarda el salario anual de un


empleado. Un procedimiento utiliza esta variable en una frmula que calcula el bonus del
empleado. Supongamos que la variable sueldoActual se escribe incorrectamente, como se
muestra en el siguiente ejemplo:

Dim sueldoActual As Integer


bonusActual = sueldoActual * .10

Con Option Explicit no habilitado (Off), este clculo supondr un bonus de $0.00 debido a que
la variable sueldoActual se declarar implcitamente como una nueva variable Object y se
inicializar vaca. Cuando sueldoActual se utilice en el clculo, Visual Basic lo convertir
automticamente a 0. Si este clculo se realiza varias veces en una estructura cclica, la
aplicacin se ejecutar sustancialmente ms lentamente porque Visual Basic necesita tiempo
para crear, inicializar, y convertir la variable cada vez.

Configurar Option Explicit


Puede establecer Option Explicit como On u Off a nivel de proyecto del entorno de desarrollo.
1. En el Explorador de soluciones, haga clic en el nombre del proyecto para el que desea
configurar Option Explicit.
2. En el men Ver, haga clic en Propiedades.

3. Activar la pgina Compilar y haga clic en Off u On segn lo deseado en la lista Option
Explicit.

Tcnica de Programacin Orientada a Objetos

157

Tambin puede configurar Option Explicit como On u Off mediante la instruccin adecuada al
inicio de su cdigo:

' This turns Option Explicit On


Option Explicit On
' This turns Option Explicit Off
Option Explicit Off

Cmo asignar valores a las variables

Introduccin
Antes de poder utilizar variables en su aplicacin, debe asignarles un valor. Puede asignar un
valor a una variable despus de declararla o mientras la declara.

Sintaxis
Para asignar un valor a una variable, utilice el operador de asignacin (=), como se muestra en
la siguiente expresin:

NombreVariable = Valor

El valor del lado derecho de la expresin se asigna a la variable del lado izquierdo de la
expresin.

Tcnica de Programacin Orientada a Objetos

158

Asignar un valor despus de declarar


Puede asignar valores a variables despus de declararlas, como se muestra en el siguiente
ejemplo:

Dim cumpleaos As Date


cumpleaos = #3/9/1974#

Cuando creamos una variable con la instruccin Dim, Visual Basic inicializa automticamente
las variables numricas a 0, las cadenas de texto a vacas ("") y las variables de fecha a 1 de
enero de 0001.

Asignar valores mientras se declara


Tambin puede asignar un valor a una variable mientras la declara, como se muestra en los
siguientes ejemplos:

Dim cumpleaos As Date = #3/9/1974#


Dim goodNews As String = "Su cheque est en el correo."
Dim testCondition As Boolean = True

Nota
Los valores de fecha (Date) deben estar encerrados entre almohadillas (##), y los valores de
cadena (String) deben estar encerrados entre comillas ("").

Tcnica de Programacin Orientada a Objetos

159

Variables vs. Constantes

Introduccin
Si una variable de su programa contiene un valor que no cambia nunca, considere almacenar
el valor como una constante en lugar de una variable. Las constantes proporcionan una forma
de utilizar nombres con significado en lugar de un valor que no cambia (como , una cantidad
matemtica fija).

Cmo funcionan las constantes


Las constantes almacenan valores que, como su nombre indica, permanecen constantes
durante la ejecucin de una aplicacin. Algunas ventajas de utilizar constantes son:
Hacen que el cdigo sea ms fcil de leer.
Utilizan menos memoria que las variables.
Hacen que los cambios a nivel de aplicacin sean ms fciles de implementar.

Sintaxis
Para declarar una constante, utilice la instruccin Const con la siguiente sintaxis:

Const nombreConstante As Type

Nombramos y especificamos los niveles de mbito de las constantes siguiendo las mismas
reglas que para las variables.

Tcnica de Programacin Orientada a Objetos

160

Ejemplo

El siguiente ejemplo muestra cmo declarar y utilizar una constante:

Dim area, radio, circunferencia As Double


Const Pi As Double = 3.1415
area = Pi * radio ^ 2
circunferencia = 2 * Pi * radio

Tcnica de Programacin Orientada a Objetos

161

mbito de una variable

Cuando utilizamos variables, debemos asegurarnos de que son accesibles desde todas las
reas de cdigo que hacen referencia a ellas. Por otra parte, es posible que necesite restringir
el acceso a determinadas variables. Todo el conjunto de cdigo que puede hacer referencia a
una variable por su nombre se denomina mbito (scope) de la variable. Esta leccin describe
los diferentes niveles de mbito aplicables a variables y explica cmo asegurarse de que cada
variable de nuestra aplicacin tiene el mbito adecuado.

Qu es el mbito?
Cuando declaramos variables, uno de los primeros aspectos que probablemente
consideraremos es el mbito. Si utilizamos una variable fuera de su mbito, el compilador
generar un error.

Tcnica de Programacin Orientada a Objetos

162

Definiciones
Para estudiar el modo de trabajo del mbito con variables, debemos estar familiarizados con
los trminos y definiciones de la siguiente tabla:

Trmino

Definicin

mbito de la variable

Conjunto de cdigo al que se refiere una variable por su nombre


asignado sin cualificadores.

Bloque

Bloque de cdigo que empieza con una condicin como If o While y


termina con una instruccin End, Loop o Next.

Procedimiento

Bloque de cdigo que empieza con una instruccin de declaracin


como Sub y termina con una instruccin End.

Mdulo

Archivo que agrupa procedimientos comunes y datos globales para


hacerlos accesibles a su uso en uno o ms proyectos.

Ensamblado

Un archivo ejecutable independiente en el que se compilan los diversos


archivos cuando genera una solucin.

Modificador de

Palabra clave como Public o Friend que utilizamos para especificar el

acceso

nivel de una variable o su contenedor (mdulo, clase o estructura).

Factores que afectan al mbito


Asignamos el mbito de una variable cuando la declaramos. Existen tres factores principales
que afectan al mbito de una variable:
Dnde la declaramos: dentro de un bloque, procedimiento, mdulo, clase o estructura.
El nivel de acceso (Public, Friend o Private) del mdulo, clase o estructura en que se
declara. El mbito de una variable no puede exceder el mbito de su contenedor.
La sintaxis que utilizamos para declarar la variable (Dim, Private, Friend o Public).

Niveles de mbito
Una variable puede tener uno de los siguientes niveles de mbito:

Nivel de mbito

Descripcin

Bloque

Disponible slo dentro del bloque de cdigo en el que se declara

Procedimiento

Disponible nicamente dentro del procedimiento en el que se declara

Mdulo

Disponible para todo el cdigo del mdulo, clase o estructura en el que


se declara

Espacio de nombres

Disponible para todo el cdigo del espacio de nombres

Podemos definir todava ms el mbito de una variable de mdulo declarando un modificador


de acceso (Private, Public o Friend) cuando la declaramos.

Tcnica de Programacin Orientada a Objetos

163

Cmo declarar variables locales


Cuando declaramos variables en un bloque o procedimiento, nos referimos a variables locales
y significa que su mbito est limitado al bloque o procedimiento en el que se declaran. Si
consideramos el mbito, las variables locales son una buena eleccin para cualquier tipo de
clculo temporal. Utilizan memoria slo cuando su procedimiento se est ejecutando, y sus
nombres no son susceptibles de conflictos de nomenclatura.

Sintaxis
Para declarar una variable local, utilice la instruccin Dim con la siguiente sintaxis:

Dim nombreVariable As Type

Ejemplo de mbito a nivel de bloque

El siguiente ejemplo muestra cmo declarar una variable local denominada blockNumber con
mbito a nivel de bloque:

If x <> 0 Then
Dim blockNumber As Integer
blockNumber = 1 / x
End If

Tcnica de Programacin Orientada a Objetos

164

Nota
En general, cuando declaramos cualquier variable, es una buena prctica de programacin
mantener el mbito lo ms estrecho posible (el mbito de bloque es el ms estrecho). Mantener
el mbito estrecho ayuda a conservar memoria y minimiza las posibilidades de que el cdigo
haga referencia a una variable equivocada.

Ejemplo de mbito a nivel de procedimiento

El siguiente ejemplo muestra cmo declarar una variable local name con mbito a nivel de
procedimiento:

Sub ShowMessage_Click( )
Dim name As String
name = NameTextBox.Text
MessageBox.Show("Bienvenido de nuevo, " & name & "!")
End Sub

Tcnica de Programacin Orientada a Objetos

165

Cmo declarar variables estticas

La vida de una variable local empieza cuando un procedimiento la invoca y acaba cuando el
procedimiento finaliza. Cuando acaba la vida de una variable local, la instancia de la variable se
destruye y su valor se pierde. En ocasiones, es posible que deseemos que la vida de una
variable local sea ms larga que la vida del procedimiento. Por ejemplo, podemos desear que
un procedimiento realice una accin especfica la primera vez que sea invocado y que no haga
nada en las siguientes llamadas. Podemos declarar una variable esttica para conseguir esta
funcionalidad.

Definicin
Una variable esttica perdurar mientras la aplicacin siga ejecutndose. Las variables
estticas siguen existiendo y conservan sus ltimos valores entre invocaciones al
procedimiento en el que se han declarado. Sin embargo, el cdigo de otros procedimientos no
puede acceder a ellas.

Sintaxis
Para declarar una variable esttica local, utilizaremos la siguiente sintaxis:

Static variableName As Type

Ejemplo
Las variables estticas resultan tiles para mantener contadores que se utilizan nicamente
dentro de un procedimiento. El siguiente ejemplo muestra cmo declarar una variable esttica
que realiza el seguimiento de cuntas veces se ejecuta el procedimiento AddItem. Cada vez
que el procedimiento se ejecuta, el valor almacenado en items se incrementa en 1.

Tcnica de Programacin Orientada a Objetos

166

Sub AddItem_Click( )
Static items As Integer
' Aadir 1 al contador
items += 1
' Usar ampersand(&) para combinar una cadena y una variable
Messagebox.Show("El contador es ahora " & items)
End Sub

Nota
Puede conseguir los mismos resultados que con el cdigo anterior declarando items como una
variable de mdulo. Sin embargo, otros procedimientos tendran acceso a la variable y podran
cambiarla. A menos que se desee mbito a nivel de mdulo, es recomendable utilizar una
variable esttica.

Tcnica de Programacin Orientada a Objetos

167

Cmo declarar variables de mdulo

Las variables declaradas en un mdulo, clase o estructura pero no dentro de un procedimiento


se denominan variables de mdulo. Despus de declarar una variable de mdulo, podemos
asignarle un valor, asignar su mbito utilizando un modificador de acceso y utilizarla dentro de
ese mbito.

Sintaxis
Para declarar una variable de mdulo, utilice la siguiente sintaxis:

AccessModifier nombreVariable As Type

Existen varios modificadores de acceso, incluyendo los descritos en la siguiente tabla:

Nota
El mbito de una variable de mdulo est determinado no slo por el modificador de acceso
utilizado para declararla, sino tambin por el nivel de acceso del mdulo, clase o estructura en
el que se declara. El mbito de la variable no puede ser mayor que el mbito de su contenedor.

Tcnica de Programacin Orientada a Objetos

168

Ejemplo de mbito a nivel de mdulo


El siguiente ejemplo muestra cmo declarar y utilizar una variable con el mbito a nivel de
mdulo:

' Put the following declaration at module level (not in any procedure)
Private myModuleMessage As String
' ...
Sub InitializeModuleVariable( )
myModuleMessage = "This variable has module-level scope."
End Sub
' ...

Sub UseModuleVariable( )
MessageBox.Show(myModuleMessage)
End Sub

Ejemplo de mbito a nivel de proyecto


El siguiente ejemplo muestra cmo declarar y utilizar una variable con el mbito a nivel de
proyecto:

' Put the following declaration at module level (not in any procedure)
Friend MyProjectMessage As String
' ...
Sub InitializeProjectVariable( )
MyProjectMessage = "This variable has project-level scope."
End Sub
' ...
Sub UseProjectVariable( )
MessageBox.Show(MyProjectMessage)
End Sub
Tcnica de Programacin Orientada a Objetos

169

Ejemplo de mbito a nivel de solucin


El siguiente ejemplo muestra cmo declarar y utilizar una variable con el mbito a nivel de
solucin:

' Put the following declaration at module level (not in any procedure)
Public MySolutionMessage As String
' ...
Sub InitializeSolutionVariable( )
MySolutionMessage = "This variable has solution-level scope."
End Sub
' ...
Sub UseSolutionVariable( )
MessageBox.Show(MySolutionMessage)
End Sub

Tcnica de Programacin Orientada a Objetos

170

Convertir tipos de datos

El proceso de convertir el valor de un tipo de datos en otro se denomina conversin o casting.


Podemos convertir explcitamente valores de un tipo en otro antes de que sean utilizados,
evitando as errores en nuestro cdigo y haciendo que ste se ejecute ms rpidamente. Visual
Basic .NET tambin puede realizar algunas conversiones de tipos de datos automtica o
implcitamente, como convertir algunas cadenas a enteros. Sin embargo, las conversiones
implcitas pueden producir resultados imprevistos.

Cules son las funciones de conversin?

Podemos utilizar funciones de conversin para forzar el resultado de una operacin a un tipo
de datos particular en lugar del tipo de datos por defecto.
Por ejemplo, podemos convertir un valor de tipo cadena a un valor entero.

Tcnica de Programacin Orientada a Objetos

171

Definicin
Las funciones de conversin permiten convertir explcitamente un valor de un tipo de datos a
otro.
Ejemplos de funciones de conversin
Visual Basic ofrece una amplia lista de funciones de conversin, incluyendo las descritas en la
siguiente tabla:

El cdigo siguiente muestra cmo utilizar varias funciones de conversin:

Private Sub Button1_Click(...)


' Use string conversion on Integer
Dim myVariable As Integer
myVariable = 1234
MessageBox.Show(myVariable)
MessageBox.Show(CStr(myVariable) & "1")
End Sub

Private Sub Button2_Click(...)


' Use integer conversion on Double
Dim myVariable As Double
myVariable = 567.9894
MessageBox.Show(myVariable)
Tcnica de Programacin Orientada a Objetos

172

MessageBox.Show(CInt(myVariable))
End Sub
Private Sub Button3_Click(...)
' Use date conversion on String
Dim myVariable As String
myVariable = "February 12, 1992"
MessageBox.Show(myVariable)
MessageBox.Show(CDate(myVariable))
End Sub

Cmo convertir explcitamente tipos de datos

Se recomienda el uso de funciones de conversin para convertir valores explcitamente antes


de que sean utilizados. Las conversiones explcitas se ejecutan ms rpidamente que las
conversiones implcitas porque no hay llamada a un procedimiento para llevar a cabo la
conversin. Una conversin implcita es una conversin automtica de un valor de un tipo en
otro.

Sintaxis
Para utilizar una funcin de conversin, se sita en el lado derecho de una instruccin de
asignacin, utilizando la siguiente sintaxis:

VariableName = CFunction(Expression)

Tcnica de Programacin Orientada a Objetos

173

El parmetro expression puede ser cualquier expresin vlida, como una variable, un resultado
de una funcin o un valor constante.

Conversiones anchas frente a conversiones estrechas


Una conversin ancha cambia un valor a un tipo de datos que puede contener cualquier valor
posible de los datos originales, como convertir un Integer en un Long. Una conversin
estrecha cambia un valor a un tipo de datos que es posible que no pueda guardar algunos de
los valores posibles, como cambiar un String en un Integer, o un Long en un Integer.

Ejemplo
El siguiente ejemplo muestra cmo utilizar las funciones de conversin CStr y CDbl para
escribir cdigo que convierte pies y pulgadas A metros.

Private Sub Calculate_Click(...)


Dim feet As Double, inches As Double
Dim millimeters As Double, meters As Double
'First, extract feet and inches from the text boxes.
'The Text property returns a string, but we need a double,so CDbl( ) is used to perform the conversion.

feet = CDbl(FeetTextBox.Text)
inches = CDbl(InchesTextBox.Text)
'Next, convert feet and inches to millimeters.
millimeters = (inches * MillimetersPerInch) + _
(feet * MillimetersPerInch * InchesPerFoot)
'Convert millimeters to meters.
meters = millimeters / 1000
'Display the result in a label. Because the Text property is a string, use CStr( ) to convert the double.

MeterResult.Text = CStr(meters)
End Sub
En este ejemplo, podemos asumir que los valores constantes MillimetersPerInch e
InchesPerFoot han sido declarados y se les han asignado valores adecuados a nivel de
mdulo.

Tcnica de Programacin Orientada a Objetos

174

Ejemplo de CInt
El siguiente ejemplo muestra cmo utilizar la funcin CInt para convertir un valor Double en un
Integer:

Dim myDouble As Double


Dim myInt As Integer
myDouble = 2345.5678
' Set myInt to 2346
myInt = CInt(myDouble)

Ejemplo de CDate
El siguiente ejemplo muestra cmo utilizar la funcin CDate para convertir cadenas en valores
Date. En general, no se recomienda codificar explcitamente fechas y horas como cadenas
(como muestra este ejemplo). En lugar de ello, utilicemos literales de fecha y hora, como #Feb
12, 1969# y #4:45:23 PM#.

Dim myDateString, myTimeString As String


Dim myDate, myTime As Date
myDateString = "February 12, 1969"
myTimeString = "4:35:47 PM"
' ...
' Convert to Date data type
myDate = CDate(myDateString)
myTime = CDate(myTimeString)

Tcnica de Programacin Orientada a Objetos

175

Cmo funciona la conversin de datos implcita

Visual Basic puede realizar algunas conversiones de tipos de datos implcitamente. Una
conversin implcita se produce cuando un valor se convierte automticamente de un tipo de
datos en otro requerido por el cdigo en que el tipo de datos se utiliza. No requiere ninguna
sintaxis especial en el cdigo fuente.

Ejemplos
Si colocamos la cadena 1234 en una variable Integer, Visual Basic convertir
automticamente la cadena en un entero. O, si una cadena como 100 se aade a un valor
numrico en la frmula 100 + 10, Visual Basic convierte implcitamente la cadena en el valor
entero 100 y lo aade a 10.

Inconvenientes
Existen inconvenientes al depender de Visual Basic para realizar conversiones implcitas. Las
conversiones implcitas pueden producir resultados imprevistos.

Por ejemplo, cuando se juntan dos cadenas, Visual Basic concatena las cadenas con
independencia de su contenido; por tanto 100 + 10 = 10010. Si se requiere una conversin
estrecha, los datos pueden truncarse. Adems, cuando Visual Basic debe realizar conversiones
implcitas, el cdigo se ejecuta ms lentamente debido al trabajo extra que Visual Basic debe
llevar a cabo.

Cmo afecta Option Strict a las conversiones de datos


Con Option Strict deshabilitado (Off) (predeterminado), todas las conversiones anchas y
estrechas pueden realizarse implcitamente. Con Option Strict habilitado (On), nicamente
estn permitidas implcitamente las conversiones anchas, y las conversiones estrechas deben
ser explcitas o el compilador generara un error.

Tcnica de Programacin Orientada a Objetos

176

Crear y utilizar estructuras

En Visual Basic .NET, podemos combinar variables de varios tipos de datos diferentes para
crear un tipo definido por el usuario denominado estructura. Las estructuras resultan tiles
cuando deseamos crear una nica variable que agrupe varias piezas de informacin
relacionadas.

Qu son las estructuras?

Podemos combinar elementos de datos de distintos tipos para crear una combinacin de tipos
de datos nica denominada estructura. Las estructuras resultan tiles cuando deseamos que
una nica variable guarde varias piezas de informacin relacionadas. Despus de declarar una
estructura, podemos declarar variables de ese tipo.

Tcnica de Programacin Orientada a Objetos

177

Definicin
Una estructura es una combinacin de tipos de datos que se crea combinando otros tipos de
datos. Las estructuras son de tipo valor (es decir, una variable de tipo estructura contiene los
datos de la estructura, en lugar de una referencia a los datos como hace el tipo referencia). Las
estructuras pueden tener datos, propiedades, mtodos y procedimientos y pueden invocar y
manipular eventos.

Ejemplo
El uso ms simple y habitual de las estructuras es encapsular variables relacionadas, creando
un tipo de datos definido por el usuario. Por ejemplo, es posible que deseemos guardar juntos
el nombre, fecha de contratacin, cargo y salario de un empleado. Podramos utilizar varias
variables para esta informacin, o podemos definir una estructura y utilizarla como la variable
de un nico empleado. La ventaja de la estructura se hace patente cuando tiene muchos
empleados y, por tanto, muchas instancias de la variable. El siguiente ejemplo muestra una
estructura Employee simple:

Public Structure Employee


Public FirstName As String
Public LastName As String
Public HireDate As Date
Public JobTitle As String
Private Salary As Decimal
End Structure

Nota
El ejemplo anterior utiliza la estructura Employee para gestionar una sencilla lista de atributos.
La estructura Employee tambin podra tener miembros como un mtodo Hire y un evento
Promoted. Sin embargo, si el diseo de su aplicacin puede beneficiarse de utilizar Employee
como plantilla para otro elemento de programacin, como un Manager o un StaffMember, sera
mejor crear Employee como clase. Las clases pueden utilizarse como plantillas, y son ms
extensibles que las estructuras.

Estructuras proporcionadas en Visual Basic .NET


Visual Basic .NET tambin proporciona numerosas estructuras predefinidas que podemos
utilizar. Por ejemplo, la siguiente lista describe varias estructuras existentes que soportan
grficos en la plataforma .NET. Estas estructuras forman parte del espacio de nombres
System.Drawing.

Tcnica de Programacin Orientada a Objetos

178

La estructura Point representa un par ordenado de coordenadas x e y de enteros que


define un punto en un plano bidimensional. Podemos utilizar la estructura Point para
capturar la ubicacin del ratn cuando el usuario hace clic en nuestra aplicacin.
La estructura Size representa el tamao de una regin rectangular utilizando un par
ordenado de anchura y altura. Utilizamos la estructura Size cuando modificamos la
propiedad Size de un formulario.
La estructura Color representa un color ARGB (alpha, red, green, blue). Utilizamos la
estructura Color cuando modificamos el color de un formulario o de un control.

Cmo declarar estructuras

El primer paso para crear una estructura es declararla. Podemos declarar estructuras en un
archivo fuente o dentro de un mdulo o clase, pero no dentro de un procedimiento.

Sintaxis

Iniciamos la declaracin de una estructura con la instruccin Structure, y la finalizamos con la


instruccin End Structure. Entre ambas instrucciones, debemos declarar al menos un
miembro. Los miembros pueden ser de cualquier tipo de datos. Podemos utilizar la siguiente
sintaxis para declarar una estructura:

AccessModifier Structure StructureName


' Declare structure members here
End Structure

Tcnica de Programacin Orientada a Objetos

179

Miembros de la estructura
Debemos declarar cada miembro de los datos de una estructura y especificar un nivel de
acceso. Esto significa que cada sentencia de la seccin de declaracin de variable de la
estructura debe utilizar Dim, Friend, Private o Public. Si Option Explicit est On, es una
buena idea incluir la clusula As en cada sentencia. Los miembros declarados con Dim tienen
por defecto acceso Public, y los miembros declarados sin la clusula As tienen por defecto el
tipo de datos Object.

No podemos inicializar ninguno de los miembros de datos en la declaracin de la estructura. Al


declarar una variable de tipo estructura, asignamos valores a los miembros accediendo a ellos
a travs de la variable.

Niveles de acceso Puede accederse a las estructuras desde cualquier lugar del archivo,
mdulo o clase en el que estn declaradas. Una estructura en un archivo es Friend por
defecto. Podemos especificar el nivel de acceso de una estructura utilizando el modificador de
acceso Public, Protected, Friend o Private como se describe en la siguiente tabla:

Ejemplo
El siguiente ejemplo muestra cmo declarar una estructura Employee para definir un conjunto
de datos relacionados con un empleado. Muestra cmo utilizar los modificadores de acceso
Public, Friend y Private para reflejar la sensibilidad de los elementos de datos.

Public Structure Employee


' Public members, accessible throughout declaration region
Public FirstName As String
Public MiddleName As String
Public LastName As String

Tcnica de Programacin Orientada a Objetos

180

' Friend members, accessible anywhere in the same assembly


Friend EmployeeNumber As Integer
Friend BusinessPhone As Long
' Private members, accessible only in the structure itself
Private HomePhone As Long
Private Salary As Double
Private Bonus As Double
End Structure

Tcnica de Programacin Orientada a Objetos

181

Cmo utilizar las estructuras

Una vez creada una estructura, podemos declarar variables a nivel de procedimiento y a nivel
de mdulo como ese tipo estructura. Podemos asignar valores a los miembros de datos de la
estructura de la variable y escribir cdigo para utilizar los miembros de la estructura.

Procedimiento

Generalmente, los pasos para utilizar las estructuras son los siguientes:
1. Declarar una estructura.
Por ejemplo, podemos crear una estructura que registre informacin sobre el sistema
de un ordenador, como sigue:

Private Structure computerInfo


Public processor As String
Public memory As Long
Public purchaseDate As Date
End Structure

2. Declarar una variable del tipo de estructura declarado.


Una vez declarada una estructura, podemos crear una variable de ese tipo de
estructura, como sigue:

Dim mySystem As computerInfo

Tcnica de Programacin Orientada a Objetos

182

3. Asignar valores a los miembros de datos.


Para asignar y recuperar valores desde los elementos de una variable estructura,
utilizamos el nombre de la variable que hemos creado junto con el elemento en el
bloque de estructura. Separamos el nombre del elemento con un punto. Por ejemplo,
podemos acceder e inicializar las variables declaradas en la estructura computerInfo
como sigue:

mySystem.processor = "x86"
mySystem.purchaseDate = #1/1/2003#
mySystem.memory = TextBox1.Text

4. Escribir cdigo para utilizar los miembros de la estructura.


Despus de asignar valores a los miembros de datos, podemos escribir cdigo para
utilizarlos desde cualquier lugar de nuestro cdigo que se encuentre dentro de su
mbito.

Nota
Una estructura puede contener cualquiera de los tipos de datos definidos en Visual Basic .NET,
incluyendo matrices, objetos y otras estructuras.

Tcnica de Programacin Orientada a Objetos

183

Enumeraciones: Constantes agrupadas


Una enumeracin es una serie de constantes que estn relacionadas entre s. La utilidad de las
enumeraciones es ms manifiesta cuando queremos manejar una serie de valores constantes
con nombre, es decir, podemos indicar un valor, pero en lugar de usar un literal numrico,
usamos un nombre, ese nombre es, al fin y al cabo, una constante que tiene un valor numrico.
En Visual Basic 2005 las enumeraciones pueden ser de cualquier tipo numrico integral,
incluso enteros sin signo, aunque el valor predefinido es el tipo Integer.
Podemos declarar una enumeracin de varias formas:
Sin indicar el tipo de datos, por tanto sern de tipo Integer:

Enum Colores
Rojo
Verde
Azul
End Enum
Indicando el tipo de datos que realmente tendr:

Enum Colores As Long


Rojo
Verde
Azul
End Enum
En este segundo caso, el valor mximo que podemos asignar a los miembros de una
enumeracin ser el que pueda contener un tipo de datos Long.
Indicando el atributo FlagsAttibute, (realmente no hace falta indicar el sufijo Attribute
cuando usamos los atributos) de esta forma podremos usar los valores de la
enumeracin para indicar valores que se pueden "sumar" o complementar entre s,
pero sin perder el nombre, en breve veremos qu significa esto de "no perder el
nombre".

<Flags()> _

Enum Colores As Byte


Rojo = 1
Verde = 2
Azul = 4
End Enum

Tcnica de Programacin Orientada a Objetos

184

Nota:

Los atributos los veremos con ms detalle en otra leccin de este


mismo mdulo.
El nombre de los miembros de las enumeraciones
Tanto si indicamos o no el atributo Flags a una enumeracin, la podemos usar de esta forma:

Dim c As Colores = Colores.Azul Or Colores.Rojo


Es decir, podemos "sumar" los valores definidos en la enumeracin. Antes de explicar con
detalle que beneficios nos puede traer el uso de este atributo, veamos una caracterstica de las
enumeraciones.
Como hemos comentado, las enumeraciones son constantes con nombres, pero en Visual
Basic 2005 esta definicin llega ms lejos, de hecho, podemos saber "el nombre" de un valor
de una enumeracin, para ello tendremos que usar el mtodo ToString, (el cual se usa para
convertir en una cadena cualquier valor numrico).
Por ejemplo, si tenemos la siguiente asignacin:

Dim s As String = Colores.Azul.ToString


La variable s contendr la palabra "Azul" no el valor 4.
Esto es aplicable a cualquier tipo de enumeracin, se haya o no usado el atributo
FlagsAttribute.
Una vez aclarado este comportamiento de las enumeraciones en Visual Basic 2005, veamos
que es lo que ocurre cuando sumamos valores de enumeraciones a las que hemos aplicado el
atributo Flags y a las que no se lo hemos aplicado. Empecemos por este ltimo caso.

Si tenemos este cdigo:

Enum Colores As Byte


Rojo = 1
Verde = 2
Azul = 4
End Enum
Dim c As Colores = Colores.Azul Or Colores.Rojo
Dim s As String = c.ToString
El contenido de la variable s ser "5", es decir, la representacin numrica del valor contenido:
4 + 1, ya que el valor de la constante Azul es 4 y el de la constante Rojo es 1.
Pero si ese mismo cdigo lo usamos de esta forma (aplicando el atributo Flags a la
enumeracin):

<Flags()> _
Enum Colores As Byte
Rojo = 1
Tcnica de Programacin Orientada a Objetos

185

Verde = 2
Azul = 4
End Enum
Dim c As Colores = Colores.Azul Or Colores.Rojo
Dim s As String = c.ToString
El contenido de la variable s ser: "Rojo, Azul", es decir, se asignan los nombres de los
miembros de la enumeracin que intervienen en ese valor, no el valor "interno".
1- Los valores de una enumeracin no son simples nmeros
Como hemos comentado, los miembros de las enumeraciones realmente son valores
de un tipo de datos entero (en cualquiera de sus variedades) tal como podemos
comprobar en la figura:

Por tanto, podemos pensar que podemos usar cualquier valor para asignar a una variable
declarada como una enumeracin, al menos si ese valor est dentro del rango adecuado.
En Visual Basic 2005 esto no es posible, al menos si lo hacemos de forma "directa" y con
Option Strict conectado, ya que recibiremos un error indicndonos que no podemos convertir,
por ejemplo, un valor entero en un valor del tipo de la enumeracin. En la figura podemos ver
ese error al intentar asignar el valor 3 a una variable del tipo Colores (definida con el tipo
predeterminado Integer).

El error nos indica que no podemos realizar esa asignacin, pero el entorno integrado de Visual
Studio 2005 tambin nos ofrece alternativas para que ese error no se produzca, esa ayuda se
obtiene presionando en el signo de admiracin que tenemos justo donde est el cursor del
mouse, pero no solo nos dice cmo corregirlo, sino que tambin nos da la posibilidad de que el
propio IDE se encargue de corregirlo, tal como podemos apreciar en la figura.

Tcnica de Programacin Orientada a Objetos

186

Lo nico que tendramos que hacer es presionar en la sugerencia de correccin, que en este
caso es la nica que hay, pero en otros casos pueden ser varias las opciones y tendramos que
elegir la que creamos adecuada.

El cdigo final (una vez corregido) quedara de la siguiente forma:

Dim c As Colores = CType(3, Colores)


CType es una de las formas que nos ofrece Visual Basic 2005 de hacer conversiones entre
diferentes tipos de datos, en este caso convertimos un valor entero en uno del tipo Colores.
Si compilamos
y ejecutamos
la
aplicacin,
sta
funcionar
correctamente.
Aunque sabemos que es posible que usando CType no asignemos un valor dentro del rango
permitido. En este caso, el valor 3 podramos darlo por bueno, ya que es la suma de 1 y 2
(Rojo y Verde), pero que pasara si el valor asignado es, por ejemplo, 15? En teora no
deberamos permitirlo.

Estas validaciones podemos hacerlas de dos formas:


1- Con la clsica solucin de comprobar el valor indicado con todos los valores posibles.
2- Usando funciones especficas del tipo Enum. Aunque en este ltimo caso, solo podremos
comprobar los valores definidos en la enumeracin.
En el siguiente ejemplo podemos hacer esa comprobacin.

Sub mostrarColor(ByVal c As Colores)


' comprobar si el valor indicado es correcto
' si no est definido, usar el valor Azul
If [Enum].IsDefined(GetType(Colores), c) = False Then
c = Colores.Azul
End If
Console.WriteLine("El color es {0}", c)
End Sub
Este cdigo lo que hace es comprobar si el tipo de datos Colores tiene definido el valor
contenido en la variable c, en caso de que no sea as, usamos un valor predeterminado.

Nota:
La funcin IsDefined slo comprueba los valores que se han
definido en la enumeracin, no las posibles combinaciones que
podemos conseguir sumando cada uno de sus miembros, incluso
aunque hayamos usado el atributo FlagsAttribute.

Tcnica de Programacin Orientada a Objetos

187

Diseo de Aplicaciones Windows en Visual Basic


.NET 2005
Windows Forms. Propiedades y Eventos.
Visual Basic es un sistema que esta diseado para crear programas ya sea tan sencillos como
los que vamos a ver y tan difciles (aunque es solo una expresin) como lo es con base de
datos.

Ahora, lo que ms nos interesa, crear un nuevo proyecto, al dar clic en el botn nuevo proyecto
te aparecer el siguiente explorador

Tcnica de Programacin Orientada a Objetos

188

Si se habrn dado cuenta, siempre se inicia en el visual Basic, y aparece seleccionada la


opcin Aplicacin para Windows, justamente lo que ms vamos a utilizar, para programar.
En donde dice nombre, va a ir el nombre de nuestro proyecto, y en donde dice ubicacin es en
donde se va a ubicar nuestro proyecto o mejor dicho en donde lo vamos a guardar.

En el proyecto, se habr creado un formulario, el cual seguramente te lo mostrar de forma


automtica. En el lado derecho de la pantalla, vers que hay un "panel" o ventana en la que se
indica el proyecto actual y se muestran los ficheros que lo componen. Ese panel es el "Solution
Explorer" o Explorardor de Soluciones.

Tcnica de Programacin Orientada a Objetos

189

Para que se muestre el formulario (Form1), haz doble click en dicho "elemento" del explorador
de soluciones.

Lo que vamos a hacer ahora es cambiar la separacin de los puntos que se muestran en el
formulario, ese "grid" o grilla, servir para ajustar los controles (ya sabrs de qu hablo) que se
aadan a dicho formulario.
Por defecto la separacin es de 8x8 puntos o pixels... y vamos a ponerlo en 4x4.
Selecciona el formulario, simplemente con hacer un click en l es suficiente.
En el panel de la derecha, debajo del explorador de soluciones, est la ventana de propiedades
del elemento que actualmente est seleccionado.

en nuestro caso son las propiedades del Form1. Vamos a buscar el elemento GridSize para
poder cambiar el tamao de separacin. Vers que se muestran dos valores separados por
punto y coma, pero tambin hay una cruz a la izquierda de la palabra GridSize, si pulsas en esa
cruz, se mostrarn los tamaos a lo que se refiere esos valores separados por punto y coma:

Tcnica de Programacin Orientada a Objetos

190

Controles Bsicos

Label (Etiqueta)

Propiedades:

Name: por motivos de reconocimiento, se puede anteceder el prefijo lbl al nombre.


Debe ser establecido generalmente cuando el control intervenga en algn proceso.
Autosize: el valor True redimensiona el largo del control al texto contenido.

Font: Permite establecer el tipo de fuente (Name), tamao (Size), Negrita (Bold),
Cursiva (Italic), Subrayado (Underline).

Forecolor: Establece el color de la fuente.

Text: Establece el texto mostrado por la etiqueta.

Textbox (Caja de Texto)

Propiedades:

Name: por motivos de reconocimiento, se puede anteceder el prefijo txt al nombre.

Backcolor: establece el color de fondo del control.

Enabled: el valor FALSE evita que el usuario pueda interactuar con el control.

MaxLength: establece el nmero mximo de caracteres permitidos.

Multiline: el valor TRUE permite que el textbox soporte varias lneas de texto.

PasswordChar: establece el carcter de password que ocultar el contenido de la


caja de texto.

Text: Establece el texto mostrado por la caja de texto.

Button (Botn)

Propiedades:

Name: por motivos de reconocimiento, se puede anteceder el prefijo btn al


nombre.

Image: establece la imagen que ser mostrada dentro del botn.

ImageAlign: define la alineacin de la imagen insertada en el botn.

Text: Establece el texto mostrado por el botn.

TextAlign: define la alineacin del texto del botn.

Tcnica de Programacin Orientada a Objetos

191

Disear una aplicacin que permita ingresar el nombre de un cliente, su clave de 3 caracteres,
y que luego se muestre un mensaje de bienvenida.

Objeto

Propiedad

Valor

Name

frmBienvenida

FormBorderStyle

FixedSingle

MaximizeBox

False

MinimizeBox

False

AceptButton

Button1

Text

INGRESO DE DATOS

Label1

Text

Nombre del Cliente:

Label2

Text

Clave secreta:

Name

lblMensaje

Autosize

False

BorderStyle

FixedSingle

Formulario

Label3
Text

TextBox1

Name

txtCliente

BackColor

Personalizado(255, 255, 192)

ForeColor

Blue

Font

Bold: True

Text
(Copiar y pegar el anterior, y modificar las siguientes
propiedades)
TextBox2

Name

txtClave

MaxLength

PasswordChar

Name

btnMostrar

Text

Mostrar

Button1

Tcnica de Programacin Orientada a Objetos

192

Tcnica de Programacin Orientada a Objetos

193

Contenido.

Uso de Estructuras de Control


o Condicionales, Selectivas Mltiples
o Repetitivas
Uso de Controles
o Opciones: CheckBox, RadioButtons
o Listados: ListBox, ComboBox
o Grficos: PictureBox
Construccin de Aplicaciones MDI
o Posicionamiento de formularios Windows en formularios MDI
o Funcionamiento de Aplicaciones MDI
o Diseo de Mens con el control MenuStrip, barras de Herramientas con
el ToolStrip y barras de estado con el StatusStrip.

Estructuras de Control
Estructuras Condicionales.
Son procesos que permiten evaluar una condicin o expresin lgica, y realizar un
bloque de instrucciones si el resultado es Verdadero, u otro, si el resultado es Falso.

If ExpresinLgica Then
.
Instrucciones del Bloque de Verdad

Else
.
Instrucciones del Bloque de Falsedad

End If

Tcnica de Programacin Orientada a Objetos

194

Aplicacin de ejemplo:
Disear un programa que permita ingresar el nombre de un alumno, y sus dos notas
correspondientes a Examen Parcial y Examen Final. Mostrar el promedio de dichas
notas, y mostrar la condicin de APROBADO o DESAPROBADO.

Al iniciar la aplicacin el botn Calcular debe estar deshabilitado, y en las notas


de Examen Parcial y Final deben mostrarse 0.
Private Sub frmCalculos_Load(..)
btnCalcular.Enabled=False
txtEP.Text = "0"
txtEF.Text = "0"
End Sub

Al ingresar el nombre del alumno se debe habilitar el botn Calcular.


Private Sub txtAlumno_TextChanged(..)
If Len(Trim(txtAlumno.Text))>0 then
btnCalcular.Enabled=True
Else
btnCalcular.Enabled=False

If
Permitir End
que solamente
ingresen valores numricos en Examen Parcial y Final.
End Sub
Private Sub txtEP_TextChanged(..)
If not IsNumeric(txtEP.Text) then
txtEP.Text=0
txtEP.Focus()

If
Tcnica de Programacin End
Orientada
a Objetos
End Sub

195

Private Sub txtEF_TextChanged(..)


If not IsNumeric(txtEF.Text) then
txtEF.Text=0
txtEF.Focus()

End Ifel clculo del promedio, y mostrar la condicin.


Realizar

End Sub
Private Sub btnCalcular_Click(..)
Dim P as Single
Dim EP as Single=CSng(txtEP.text)
Dim EF as Single=CSng(txtEF.text)
P=(EP+EF)/2
If P>=10.5 then
txtCondicion.Text=Aprobado

Estructuras Selectivas Mltiples


Else

Son procesos en donde se evala el valor de una variable, y


txtCondicion.Text=Desaprobado
Select Case Variable
End If Case Valor1:
Instrucciones 1
End Sub
Case Valor2:
Instrucciones 2
Case Expresion:
Instrucciones3
Case Else
Instrucciones
End Select

Los valores se pueden evaluar de manera individual, especificando los valores


separados por comas, definiendo el rango de valores usando to o estableciendo los
valores con IS.

Tcnica de Programacin Orientada a Objetos

196

Aplicacin de ejemplo:

En la aplicacin anterior, se debe realizar una modificacin al mostrar la condicin, de


acuerdo a la siguiente tabla.
CONDICION

PROMEDIOS
20

Excelente

Entre 15 y 19

Bueno

Entre 11 y menor a 15

Regular

Menor que 11

Malo

Otras notas ingresadas

Error en las notas

Private Sub btnCalcular_Click(..)


Dim P as Single
Dim EP as Single=CSng(txtEP.text)
Dim EF as Single=CSng(txtEF.text)
P=(EP+EF)/2
Select Case Math.Round(P)
Case 20
txtCondicion.Text=Excelente
Case 15,16,17,18,19
txtCondicion.Text=Bueno
Case 11 to 14
txtCondicion.Text=Regular
Case Is<11
txtCondicion.Text=Malo
Case else
txtCondicion.Text=Error en las notas
End Select

Tcnica de Programacin Orientada a Objetos


End Sub

197

Estructuras Repetitivas
Son procesos que permiten repetir una serie de instrucciones, ya sea controlada
mediante un contador o mediante el resultado de evaluar una expresin lgica.

Do While (ExprLgica)
Instrucciones (si la Exp. Lgica es Verdadera)
.
[Exit Do]

Loop

Do
Instrucciones (si la Exp. Lgica es Verdadera)
.
[Exit Do]

Loop While (ExprLgica)

Do
Instrucciones (si la Exp. Lgica es Falsa)
.
[Exit Do]

Loop Until (ExprLgica)

For Var=ValorInicial to ValorFinal [step inc / dec ]


Instrucciones
.
[Exit For]
Next

Tcnica de Programacin Orientada a Objetos

198

Aplicacin de ejemplo:

Construir una aplicacin que permita generar los 10 primeros mltiplos de 5, en una
caja de texto de tipo multilnea.

Usando Do While

Private Sub btnGenerar_Click(..)


Dim cont,num as Integer
Do while cont<10
cont+=1
num=cont*5
txtSerie.AppendText(CStr(num)+vbCrLf)
Loop
End Sub

Usando Do Loop While

Private Sub btnGenerar_Click(..)


Dim cont,num as Integer
Do
cont+=1
num=cont*5
txtSerie.AppendText(CStr(num)+vbCrLf)
Loop While cont<10
End Sub

Tcnica de Programacin Orientada a Objetos

199

Usando Do Loop Until

Private Sub btnGenerar_Click(..)


Dim cont,num as Integer
Do
cont+=1
num=cont*5
txtSerie.AppendText(CStr(num)+vbCrLf)
Loop Until cont>=10
End Sub

Usando For

Private Sub btnGenerar_Click(..)


Dim i,num as Integer
For i=1 to 10
num=i*5
txtSerie.AppendText(CStr(num)+vbCrLf)
Next
End Sub

Tcnica de Programacin Orientada a Objetos

200

Uso de Controles de Opciones


1. Botn de Radio (RadioButton)
Se utiliza para presentar al usuario un conjunto de opciones mutuamente excluyentes
entre si es decir, si el usuario selecciona un componente RadioButton todos los
dems se desmarcan o deseleccionan solos.

Propiedades:

Name: por motivos de reconocimiento, se puede anteceder el prefijo rbt al nombre.


Checked: Establece si el botn de radio se encuentra activo (True) o no (False).

2. Casilla de Verificacin (CheckBox)


Un control CheckBox indica cuando un valor particular esta encendido o apagado,
verdadero o falso, si o no, puede ser utilizado tambin para seleccionar mltiples items
de una lista de opciones.

Propiedades:

Name: por motivos de reconocimiento, se puede anteceder el prefijo chk al


nombre.
Checked: Establece si el checkbox se encuentra marcado (True) o desmarcado
(False).

3. Grupo de Botones(GroupBox)
Antes conocido como Frame, es un contenedor que se utiliza para agrupar varias
opciones, que pueden ser: de opcin nica como los RadioButton o de opcin mltiple
como los CheckBox. Este control se utiliza como contenedor y por si solo no tiene
mucha funcionalidad.
Propiedades:

Name: por motivos de reconocimiento, se puede anteceder el prefijo gbx al


nombre.
Enabled: habilita (True) o deshabilita (False) los controles contenidos.
Text: Establece el texto que se mostrar como encabezado.
Visible: Muestra (True) u oculta (False) los controles contenidos.

Tcnica de Programacin Orientada a Objetos

201

Aplicacin de ejemplo:
Disear una aplicacin que permita ingresar el sueldo de una persona (Sueldo Bruto).
Se podrn seleccionar los descuentos a los cuales esta afecto como Impuesto a la
Renta (5%), descuento por AFP (2%) y descuento por ESSALUD (1%), todos se
aplican sobre el sueldo bruto. Adems, se dar una bonificacin de 100.00 a los
empleados que tienen estado civil CASADO. Mostrar los importes totales de los
descuentos, bonificaciones y Sueldo Neto.

Al iniciar la aplicacin se deber mostrar en el Sueldo Bruto, Total


Bonificaciones, Total Descuentos y Sueldo Neto el valor de 0

Private Sub frmCalculos_Load(..)


txtSBruto.Text = "0"
txtTBon.Text = "0"
txtTDesc.Text = "0"
txtSNeto.Text = "0"
o Restringiremos que solamente ingresen valores numricos en el Sueldo Bruto,
End Sub
y si ingresan caracteres se deber limpiar el contenido.
Private Sub txtSBruto_TextChanged(..)
If Not IsNumeric(txtSBruto.Text) Then
txtSBruto.Text = 0
End If
End Sub

Tcnica de Programacin Orientada a Objetos

202

Podramos realizar todo el proceso de clculo de las bonificaciones y


descuentos en el botn Procesar.

Private Sub btnProcesar_Click(..)


Dim SB As Single = CSng(txtSBruto.Text)
Dim IR, DAFP, DESSALUD, TBON As Single
----En los RadioButtons----If rbtSol.Checked Then
TBON = 0
End If
If rbtCas.Checked Then
TBON = 100
End If
----En los CheckBox--------If chkIR.Checked Then
IR = 0.05 * SB
Else
IR = 0
End If
If chkAFP.Checked Then
DAFP = 0.03 * SB
o

Else
Ejecute la aplicacin y compruebe. A continuacin, se realizar el mismo
proceso de
manera
DAFP
= 0directa desde los radiobuttons y desde los checkbox.

End If
Private Sub rbtSol_CheckedChanged(..)
If chkEssalud.Checked Then
txtTBon.Text = 0
DESSALUD = 0.01 * SB
Else
End Sub Sub rbtCas_CheckedChanged(..)
Private
DESSALUD = 0
txtTBon.Text = 100
End If

End Sub
TDESC=IR+DAFP+DESSALUD
NETO=SB+TBON-TDESC

Tcnica de Programacin Orientada a Objetos


txtTBon.Text = TBON

203

O usando el manejador de eventos.

Private Sub rbtCas_CheckedChanged(..)Handles


rbtCas.CheckedChanged, rbtSol.CheckedChanged

Select Case CType(sender, RadioButton).Name


Case "rbtSol"
txtTBon.Text = 0
Case "rbtCas"
o

txtTBon.Text = 100
Segn la forma anterior, tambin se podra utilizar en la codificacin del grupo
deEnd
checkbox.
Select

Private Sub chkIR_CheckedChanged(..)Handles chkIR.CheckedChanged,


chkEssalud.CheckedChanged,chkAfp.CheckedChanged
End Sub

Dim sb As Single = CSng(txtSBruto.Text)


Static d1, d2, d3 As Single
Select Case CType(sender, CheckBox).Name
Case "chkIR"
If chkIR.Checked Then
d1 = sb * 0.05
Else
d1 = 0
End If
Case "chkEssalud"
If chkEssalud.Checked Then
d2 = sb * 0.03
Else
d2 = 0
End If
Case "chkAFP"
If chkAFP.Checked Then
d3 = sb * 0.02

Tcnica de Programacin Orientada


a Objetos
Else
d3 = 0
End If

204

Uso de Controles de Listas


1. Cuadro de Lista (ListBox)
Una caja de lista es til cuando al usuario se le presenta un conjunto de opciones fijas
(el puede escoger solamente de las opciones mostradas, no hay posibilidad de teclear
otra alternativa).
Un ejemplo puede ser al ofrecer una lista de los dias de la semana, los lugares para
vacacionar de una agencia de viajes, o los tratamientos ofrecidos por un saln de
belleza.

Propiedades:

Name: por motivos de reconocimiento, se puede anteceder el prefijo lst al nombre.

Aplicacin de ejemplo:

Disear la siguiente aplicacin.

Agregar los elementos Aries y Tauro en tiempo de diseo usando la


propiedad Items.

Tcnica de Programacin Orientada a Objetos

205

Agregar los elementos Geminis y Cancer al cargar el formulario.

Private Sub Form_Load(..)


lstSignos.Items.Add(Geminis)
lstSignos.Items.Add(Cancer)
End Sub
o

Habilitar el botn Agregar al escribir un Signo en el textbox txtSigno.

Private Sub txtSigno_TextChanged(..)


If Len(Trim(txtSigno.Text))>0 then
btnAgregar.Enabled=True
Else
btnAgregar.Enabled=False
End If
o

Agregar el elemento introducido en el textbox al listbox.

End Sub
Private Sub btnAgregar_Click(..)
Dim cad as String = Trim(txtSigno.Text)
lstSignos.Items.Add(cad)
txtSigno.Text=
txtSigno.Focus()

Sub el elemento seleccionado del listbox.


oEndEliminar

Tcnica de Programacin Orientada a Objetos

206

Private Sub btnEliminar_Click(..)


Dim item As Integer = lstSignos.SelectedIndex
lstSignos.Items.RemoveAt(item)

End Sub
o Eliminar todos los elementos del listbox.

Private Sub btnBorrarTodo_Click(..)


lstSignos.Items.Clear()

End Sub

2. Cuadro Combinado (ComboBox)


Un ComboBox es un control que combina las caractersticas de un ListBox y de un
TextBox, es decir, permite mostrar una serie de elementos o tems en la parte de la
lista, y se comporta como un textbox por que el usuario puede ingresar datos.

Hay tres tipos de Cuadros combinadas (Simple, DropDown y DropDownList). El valor


que se coloca en la propiedad DropDownStyle es el que determina el tipo. Los Cuadros
Combinados DropDown y DropDownList son una buena opcin cuando el espacio es
limitado, porque toda la lista se muestra como un men de cascada, as no ocupa el
espacio en la pantalla hasta que se da clic a la flecha hacia abajo. Los Cuadros
Combinados Simple y DropDown se considera cuando el usuario puede introducir una
opcin que no est predefinida.

Propiedades:
Name: por motivos de reconocimiento, se puede anteceder el prefijo cbo al nombre.
DropDownStyle: determina el estilo del ComboBox.

Tcnica de Programacin Orientada a Objetos

207

Aplicacin de ejemplo:

Disear la siguiente aplicacin con tres ComboBox, de estilos diferentes y nombres


cboEstilo1, cboEstilo2 y cboEstilo3.

Adicionar los elementos en tiempo de ejecucin, al cargar el formulario.


Private Sub Form_Load(..)
cboEstilo1.Items.Add(Aries)
cboEstilo1.Items.Add(Tauro)
cboEstilo1.Items.Add(Geminis)
cboEstilo1.Items.Add(Acuario)
cboEstilo1.Items.Add(Escorpio)
cboEstilo1.Items.Add(Capricornio)
With cboEstilo2.Items
.Add(Aries)
.Add(Tauro)
.Add(Geminis)
.Add(Acuario)
.Add(Escorpio)
.Add(Capricornio)

End with

Dim signos()={Aries,Tauro,Geminis,Acuario,

Tcnica de Programacin Orientada a Objetos

Escorpio,Capricornio}
cboEstilo3.Items.Addrange(signos)

208

Uso de Controles Grficos

PictureBox (PictureBox)
El PictureBox es un control que permite insertar un archivo de formato grfico, el cual
puede ser importado desde un archivo de recursos, o como referencia a un archivo en
alguna ubicacin.

Propiedades:

Name: por motivos de reconocimiento, se puede anteceder el prefijo pic al nombre.


BorderStyle: establece el tipo de borde del control, puede ser un borde fijo simple
(FixedSingle) o un borde 3D (Fixed3D).
Image: establece el archivo que ser insertado en el picturebox.
SizeMode: establece el tipo de ajuste del contenido sobre el tamao del control.

Aplicacin de ejemplo:

Disear la siguiente aplicacin.

Insertar un picturebox y establecer las siguientes propiedades:


Name:
picEmoticon
BorderStyle: FixedSingle
SizeMode:
StretchImage

Tcnica de Programacin Orientada a Objetos

209

Image:

En el checkbox Mostrar (chkMostrar), definir el cdigo que permita mostrar u


ocultar el picturebox.

Private Sub chkMostrar_CheckedChanged(..)


If chkMostrar.Checked then
picEmoticon.Visible = True
Else
picEmoticon.Visible = False
End If
o

Aadir un ComboBox que permita mostrar los elementos: Burlon, Golpeado,


Tragon y Emoticon. Cuando el usuario seleccione uno de estos elementos se
debe Sub
cargar las imgenes respectivas.
End

Tcnica de Programacin Orientada a Objetos

210

El formato de archivo de recursos .resx consiste en entradas XML, que


especifican objetos y cadenas en etiquetas XML. La ventaja que ofrecen los
archivos .resx es que al abrirlos en un editor de texto (como Bloc de Notas o
Microsoft Word), es posible analizarlos, manipularlos y escribir en ellos.
Cuando se ve un archivo .resx, se puede observar realmente la forma binaria
de un objeto incrustado (por ejemplo, una imagen) cuando esta informacin
binaria es parte del manifiesto del recurso. Adems de ofrecer esta informacin
binaria, los archivos .resx son completamente legibles y susceptibles de
mantenimiento.

Ir al Explorador de Soluciones y activar Mostrar todos los archivos, y observar


el archivo de recursos.

Ir a Agregar recurso > Agregar archivo existente, y adicionar las otras


imgenes que requiere.

Tcnica de Programacin Orientada a Objetos

211

Observar el explorador de soluciones.

En el combobox:
Private Sub cboImagenes_SelectedIndexChanged (..)
Select Case cboImagenes.SelectedIndex
Case 0
picEmoticon.Image = My.Resources.burlon
Case 1
picEmoticon.Image = My.Resources.golpeado
Case 2
picEmoticon.Image = My.Resources.tragon

Case 3
Aplicacin de ejemplo:

picEmoticon.Image = My.Resources.emoticon
Disear un formulario que muestre dos cuadros de lista y una serie de botones que
permitan pasar los elementos
de una lista a otra.
End Select
End Sub

Tcnica de Programacin Orientada a Objetos

212

Declarar tres constantes que almacenen textos que sern usados en cajas de mensaje:
"Lista de Elementos", "Para eliminar un dato, debe seleccionarlo previamente",
"Para pasar un dato, debe seleccionarlo previamente".
Private Const msgbox_Title As String = "Lista de
Elementos"

Private Const msgbox_Eliminar As String = "Para eliminar


un dato, debe seleccionarlo previamente"

Private Const msgbox_Pasar_Dato As String = "Para pasar un


dato,12debe
seleccionarlo
previamente"
Mostrar
elementos
en el primer cuadro
de lista, y en el label, la cantidad de
elementos.
Private Sub Form1_Load(..)
With ListBox1
.Items.Add("Naranja")
.Items.Add("Pera")
.Items.Add("Melocotn")
.Items.Add("Albaricoque")
.Items.Add("Manzana")
.Items.Add("Pltano")
.Items.Add("Meln")
.Items.Add("Mango")
.Items.Add("Uvas")

El botn Aadir, permite


agregar nuevos elementos al cuadro de lista 1.
.Items.Add("Sanda")
Private Sub Button5_Click(..)
.Items.Add("Limn")
'Aadir
ListBox1
.Items.Add("Fresquilla")
If
<> "" Then
EndTextBox1.Text
With
ListBox1.Items.Add(TextBox1.Text)
Label1.Text
= ListBox1.Items.Count & " elemento(s)"
End Sub

Label1.Text = ListBox1.Items.Count & "


elemento(s)"
TextBox1.Text = ""
End If

End Sub

Tcnica de Programacin Orientada a Objetos

213

El botn Eliminar, permite eliminar un elemento seleccionado del cuadro de lista 1.


Private Sub Button6_Click(..)
'Eliminar ListBox1
If ListBox1.SelectedIndex <> -1 Then
'Si hay datos seleccionados en el control,
'eliminamos el dato seleccionado
ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
Label1.Text = ListBox1.Items.Count & "
elemento(s)"
Else

MessageBox.Show(msgbox_Eliminar,
Pasar un elemento
del cuadro de lista 1 al cuadro de lista 2. msgbox_Title,
MessageBoxButtons.OK, MessageBoxIcon.Information)
Private Sub Button6_Click(..)
End If
'Eliminar ListBox1
End Sub
If ListBox1.SelectedIndex <> -1 Then
'Si hay datos seleccionados en el control,
'eliminamos el dato seleccionado
ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
Label1.Text = ListBox1.Items.Count & "
elemento(s)"
Else

MessageBox.Show(msgbox_Eliminar,
msgbox_Title,
Pasar todos los elementos
del cuadro de lista 1 al cuadro de lista
2.
MessageBoxButtons.OK, MessageBoxIcon.Information)
Private Sub
End Button2_Click(..)
If
End Sub Dim a As Integer = 0
'Pasa un dato seleccionado del control ListBox1

al

control ListBox2
If ListBox1.SelectedIndex <> -1 Then
'

'Si hay datos seleccionados en el control,

'

'pasamos el dato seleccionado

While a < ListBox1.Items.Count


' si el elemento esta seleccionado
If ListBox1.GetSelected(a)
= True Then
Tcnica de Programacin Orientada
a Objetos
ListBox2.Items.Add(ListBox1.Items.Item(a))

214

'Si hay datos seleccionados en el control,


'pasamos el dato seleccionado
ListBox2.Items.Add(ListBox2.SelectedItem)
ListBox1.Items.RemoveAt(ListBox2.SelectedIndex)
Label1.Text = ListBox1.Items.Count & " elemento(s)"
Label2.Text = ListBox2.Items.Count & " elemento(s)"
Else
If ListBox1.Items.Count > 0 Then
MessageBox.Show(msgbox_Pasar_Dato, msgbox_Title,
MessageBoxButtons.OK, MessageBoxIcon.Information)

Pasar un elemento del cuadro de lista 2 al cuadro de lista 1.


End If
Private Sub Button3_Click(..)
End If
'Pasa un dato seleccionado del control ListBox2 al
control ListBox1
End Sub

If ListBox2.SelectedIndex <> -1 Then


'Si hay datos seleccionados en el control,
'pasamos el dato seleccionado
ListBox1.Items.Add(ListBox2.SelectedItem)
ListBox2.Items.RemoveAt(ListBox2.SelectedIndex)
Label1.Text = ListBox1.Items.Count & " elemento(s)"
Label2.Text = ListBox2.Items.Count & " elemento(s)"
Else
If ListBox2.Items.Count > 0 Then
MessageBox.Show(msgbox_Pasar_Dato, msgbox_Title,
MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End If

End Sub

Tcnica de Programacin Orientada a Objetos

215

Pasar todos los elementos del cuadro de lista 2 al cuadro de lista 1.


Private Sub Button4_Click(..)
'Pasa todos los elementos del control ListBox2 al
control ListBox1
While ListBox2.Items.Count > 0
ListBox2.SelectedIndex = ListBox2.Items.Count - 1
ListBox1.Items.Add(ListBox2.SelectedItem)
ListBox2.Items.RemoveAt(ListBox2.SelectedIndex)
End While

El botn Ordenar
datos permitir
ordenar alfabticamente los
de ambos
Label1.Text
= ListBox1.Items.Count
& elementos
" elemento(s)"
cuadros de lista.
Label2.Text = ListBox2.Items.Count & " elemento(s)"
Private Sub Button7_Click(ByVal ..)
End Sub

ListBox2.Sorted = True
ListBox2.Sorted = False

End Sub

Tcnica de Programacin Orientada a Objetos

216

Construccin de Aplicaciones MDI


Visual Basic permite crear aplicaciones empleando una interfaz de mltiples documentos (MDI:
Multiple Document Interface), o dicho en trminos de Visual Basic, mltiples formularios. En
una aplicacin MDI, se pueden abrir varias ventanas hijas. Cada una de estas ventanas hijas
(formularios) son iguales entre s. En una aplicacin MDI puede haber varias ventanas hijas,
pero solo una ventana padre por aplicacin. El formulario padre acta como contenedor de los
formularios hijos. Muchos procesadores de textos bajo Windows son buenos ejemplos de
aplicaciones MDI.

Formulario Padre

Formulario 1

Formulario Hijo 1
Formulario 3
Formulario Hijo 2

Ejemplo: MDI (Multiple Document Interface)

Formulario 2

Ejemplo: SDI (Simple Document Interface)

Para cargar formularios en un proyecto y poder interactuar entre ellos, tenemos diferentes
opciones:
1.- Instanciamos un formulario y lo cargamos. Este es la forma tradicional de la orientacin a
objetos clsica y que es la usada en VB.NET 2002 y VB.NET 2003. Tambin utilizada en VB
2005 por supuesto:

Private Sub Button1_Click(..) Handles Button1.Click


Dim MiF As New Form2
MiF.Show()
End Sub

2.- Utilizamos una instancia por defecto para cargar el formulario utilizando el nombre de
espacio My (slo para Visual Basic 2005):

Private Sub Button1_Click(..) Handles Button1.Click


My.Forms.Form2.Show()
End Sub

3.- Utilizamos una instancia por defecto para cargar el formulario de forma directa (slo para
Visual Basic 2005):

Tcnica de Programacin Orientada a Objetos

217

Private Sub Button1_Click(..) Handles Button1.Click


Form2.Show()
End Sub

En esta sesin, crearemos un formulario de acceso que permita abrir un formulario principal de
tipo MDI, que a su vez contenga una barra de Men (MenuStrip) desde donde llame a otros
formularios hijos, y una barra de estado (StatusStrip) que permita mostrar cierta informacin.

Como agregar un formulario MDI al Proyecto?


-

Crear un proyecto de Visual Basic de nombre SISTEMA, que se guarde en el


Escritorio.

Creacin del formulario de Acceso.

Objeto

Formulario

TextBox1

Propiedad

Valor

Name

frmAcceso

FormBorderStyle

FixedSingle

MaximizeBox

False

MinimizeBox

False

Text

ACCESO AL SISTEMA

Name

txtUsuario

Name

txtPassword

PasswordChar

Name

btnIngresar

Text

&Ingresar

Enabled

False

Name

btnCancelar

Text

&Cancelar

TextBox2

Button1

Button2

Tcnica de Programacin Orientada a Objetos

218

Para agregar otro formulario al proyecto, ir al Men Proyecto > Agregar


Windows Forms

Establecer las siguientes propiedades para el nuevo formulario. La propiedad


IsMDIContainer definirla a True para que se comporte como un MDI o
contenedor de formularios.

Objeto

Propiedad

Valor

Name

frmPrincipal

IsMDIContainer

True

Text

PANEL PRINCIPAL

WindowState

Maximized

Formulario

Como insertar una Barra de Men al formulario MDI?

El control MenuStrip
permite insertar una barra de Men que
presenta opciones que permiten realizar diferentes tipos de acciones, como
abrir formularios, cargar aplicaciones, salir del proyecto, etc.

Tcnica de Programacin Orientada a Objetos

219

Escribir las opciones siguientes:

Insertar un separador.

Aadir la opcin de Salir con un ShortcutKey de Ctrl + F4

Completar las opciones del Men.

Tcnica de Programacin Orientada a Objetos

220

Para insertar las imgenes junto a las opciones del men, establecer en la
propiedad Image el valor de

Como insertar una Barra de Estado al formulario MDI?

El control StatusStrip
permite insertar una barra de Estado
que presenta paneles en los cuales se puede mostrar informacin como por
ejemplo, un mensaje de confirmacin, una accin a realizar, opciones activas
del sistema como activacin del teclado numrico o maysculas, etc.

Asumiendo que la resolucin del monitor es un estndar de 1024x768,


crearemos tres paneles de texto (StatusLabel) de ancho 150, 624 y 150. Para
cada panel modificaremos algunas propiedades:

Tcnica de Programacin Orientada a Objetos

221

Objeto

ToolStatusStrip3

ToolStatusStrip2

Propiedad

Valor

BorderSides

Todo (All)

Autosize

False

BorderStyle

SunkenOuter

Size > Width

150

Text

0:0:0

Image

(Insertar Reloj al archivo de recursos)

ImageAlign

MiddleRight

BorderSides

Todo (All)

Autosize

False

BorderStyle

SunkenOuter

Size > Width

624

Text

ToolStatusStrip1

BorderSides

Todo (All)

Autosize

False

BorderStyle

SunkenOuter

Size > Width

150

Text

Usuario:

Image

(Insertar User al archivo de recursos)

ImageAlign

MiddleLeft

Como insertar una Barra de Herramientas al formulario MDI?

El control ToolStrip
permite insertar una barra de
herramientas que muestra botones que permitan realizar las acciones ms
importantes, como carga de formularios o aplicaciones.

Tcnica de Programacin Orientada a Objetos

222

Modificar las propiedades del ToolStrip para que se muestre de la siguiente


manera:

Objeto

(Button)

Propiedad
DisplayStyle

Image

Image

(Insertar Calculadora del archivo


de recursos)

ToolTipText

Calculadora

DisplayStyle

Image

Image

(Insertar Excel del archivo de


recursos)

ToolTipText

MS Excel 2007

DisplayStyle

ImageAndText

Image

(Insertar Tabla del archivo de


recursos)

Text

Tabla de Multiplicar

ToolStripButton1

(Button)

Valor

ToolStripButton2

(Separator)
ToolStripSeparator1

(Button)
ToolStripButton4

Tcnica de Programacin Orientada a Objetos

223

En el formulario frmAcceso, habilitar el botn btnIngresar solamente cuando el


usuario haya ingresado el nombre de usuario y password.
Private Sub txtUsuario_TextChanged(..)Handles
txtUsuario.TextChanged, txtPassword.TextChanged

If Len(Trim(txtUsuario.Text)) > 0 And


Len(Trim(txtPassword.Text)) > 0 Then
btnIngresar.Enabled = True
Else

btnIngresar.Enabled = False
Si el password ingresado es SISE (maysculas o minsculas), ocultar
frmAcceso
mostrar frmPrincipal.
End yIf
Private Sub txtUsuario_TextChanged(..)Handles
txtUsuario.TextChanged, txtPassword.TextChanged
End Sub

If UCase(txtPassword.Text) = "SISE" Then


Me.Hide()
frmPrincipal.Show()
End If
Sub
End
En el
formulario frmPrincipal, la funcionalidad de las opciones de men
Calculadora y Excel 2007, permitirn ejecutar estas aplicaciones usando la
instruccin Shell dentro de un Try..Catch para interceptar el error en caso de
que el archivo no se encuentre en el equipo.
Private Sub CalculadoraDeWindowsToolStripMenuItem_Click(..)
Handles CalculadoraDeWindowsToolStripMenuItem.Click
Try
Dim n = Shell("C:\Windows\System32\calc.exe",
AppWinStyle.NormalFocus)
Catch ex As Exception
MessageBox.Show("No se ha encontrado la
aplicacion", "Error", MessageBoxButtons.OK,
MessageBoxIcon.Warning)
End Try
End Sub

Tcnica de Programacin Orientada a Objetos

224

Defina las instrucciones para la opcin MS Excel 2007.

Como este bloque de acciones es el mismo que debe ser ejecutado al pulsar el
botn respectivo en el ToolStrip, entonces podramos modificar el Handles.
Private Sub CalculadoraDeWindowsToolStripMenuItem_Click(..)
Handles CalculadoraDeWindowsToolStripMenuItem.Click,
ToolStripButton1.Click
Try
Dim n = Shell("C:\Windows\System32\calc.exe",
AppWinStyle.NormalFocus)
Catch ex As Exception
MessageBox.Show("No se ha encontrado la
aplicacion", "Error", MessageBoxButtons.OK,

Se pueden heredarMessageBoxIcon.Warning)
las caractersticas de un formulario?
End Try
La herencia es una de las caractersticas resaltantes de la programacin orientada a objetos, y
cuando diseamos
un formulario con determinadas propiedades, podemos hacer que otros
End Sub
formularios hereden dichas propiedades, ahorrando bastante tiempo en el diseo de las
interfaces.

Agregar al proyecto anterior un formulario Windows,y establecer las siguientes


propiedades:

Objeto

Formulario

Propiedad

Valor

Name

frmPlantilla

Backcolor

(Amarillo claro)

FormBorderStyle

FixedSingle

Font > Bold

True

MaximizedButton

False

MinimizeButton

False

Text

Tcnica de Programacin Orientada a Objetos

225

Ir al Men Generar > Generar Sistema (este nombre depende del nombre del
proyecto).

Agregar un formulario Windows, pero esta vez seleccionar Formulario


Heredado, y establecer por nombre frmTabla.

Seleccionar el formulario que ser usado para heredar las propiedades a los
hijos.

Tcnica de Programacin Orientada a Objetos

226

El formulario resultante podr ahora ser modificado y tener la siguiente


apariencia.

Realizar el mismo procedimiento para el diseo del formulario frmArea.

Como se llaman a los formularios hijos?


En la pgina X (Construccin de Aplicaciones MDI), se detallan los mtodos de carga, el
primero permite abrir varias instancias del formulario hijo, mientras que los otros, permiten abrir
solo una instancia.

En el Men Aplicaciones > Matemticas > rea de un Rectngulo, de un


doble clic para abrir la ventana de cdigo y escribir.

Private Sub AreaDeUnRectanguloToolStripMenuItem_Click (..)


Dim form As New frmArea
form.MdiParent = Me
form.Show()

Tcnica de Programacin Orientada a Objetos


End Sub

227

En la opcin Tabla de Multiplicar, del mismo men, escribir este otro cdigo, y
notar las diferencias entre ambos.

Private Sub GeneracionDeTablasDeMultiplicarToolStripMenuItem_Click (..)


frmTabla.MdiParent = Me
frmTabla.Show()

End Sub

En frmTabla, escribir el cdigo que debe ser usado en el botn Generar para
mostrar la tabla de multiplicar del 1 al 12 de un nmero entero cualquiera
ingresado en la caja de texto (Consistencie que solamente ingresen nmeros)

En frmArea, escribir el cdigo que debe ser usado en el botn Operar para
calcular el rea de un Rectngulo. Debe consistenciar que solamente ingresen
valores numricos en las cajas de texto de base y altura.

Ejercicios propuestos.

1- Ingrese por teclado en una caja de texto la hora en formato de 24 horas y en otra caja
de texto la cantidad de minutos al hacer clic en un botn deber salir la hora en
formato de 12 horas por ejemplo si se ingresa 23 en una caja y en la otra 12 el
resultado seria 11:12:PM

2- Ingrese la cantidad de minutos hablados por una persona y escoja el tipo de llamada
(Local, Nacional, Internacional).Se visualizara el importe de la llamada sabiendo que
por los 3 primeros minutos se paga S/ 1.00 y por cada minuto adicional se paga 0.50
en caso sea local si es nacional se incrementa el 25% y si es internacional se
incrementa el 60% a los precios por minuto.

3- Ingresar el nombre de un trabajador, la cantidad de hijos y su sueldo, si este tiene hijos


se le dar una bonificacin de S./40.00 por hijo y si no tiene hijos se le dar el 25% de
su sueldo se deber mostrar la bonificacin y el sueldo final.

4- Ingrese por teclado dos nmeros y al escoger un signo de operacin se deber mostrar
el resultado de la operacin.

Tcnica de Programacin Orientada a Objetos

228

5- Ingrese un numero mximo de 2 cifras si el numero es de una cifra se deber mostrar


cuanto falta para convertirse en un numero de 2 cifras, y si es de 2 cifras se deber
mostrar cuanto falta para convertirse en un numero de 3 cifras.

6- Ingrese un nmero cualquiera y muestre la cantidad de cifras que tiene segn sea el
caso.
Ejemplo: 203 = Tiene 3 cifras, 45678 = Tiene 5 cifras tome en cuenta que el numero
mximo a ingresar es un milln.

7- Ingrese por teclado el nombre, ao de nacimiento y sexo de una persona (M o F),se


deber mostrar uno de los siguientes mensajes.
- Varn mayor de edad
- Varn menor de edad
- Dama mayor de edad
- Dama menor de edad

8- Ingrese un nmero y visualcelo en romano.

9- Ingrese por teclado el da de nacimiento y el mes de nacimiento de una persona al


hacer clic se deber mostrar su signo zodiacal as como tambin deber aparecer la
imagen del signo Zodiacal en un control PictureBox.

10- Se deber desarrollar un algoritmo en el cual se deber ingresar el nombre de un


alumno y se deber escoger el turno en el que estudia (M , T y N) as como tambin el
ciclo (I, II, III, IV, V, VI y SIDET) y la carrera (CI, Enfermera y Administracin) se
deber calcular el pago de su pensin en base a los siguientes datos:

el precio por carrera es:


CI = 320.00
Enfermera = 280.00
Administracin = 270.00
Adems que dependiendo del ciclo en el que estn se pagara un recargo del precio de
10,20,30,40,50,60 y 70% (para SIDET). As como tambin si es del turno M se
deber recargar 10% mas solo si esta en I, II, o III ciclo, si es del turno T se recarga el
15 % mas solo si esta en I, o II y por ltimo si es del turno N se le har un descuento
del 15 % solo si esta en SIDET
Al finalizar solo se debe mostrar el monto de la pensin.

Tcnica de Programacin Orientada a Objetos

229

11- Realizar el siguiente formulario:

12- Se deber ingresar el largo y el ancho del terreno y conforme vayan digitndolo
deber salir el total (Largo * ancho)

13- Se deber ingresar el precio por metro y al escoger una categora el precio se
incrementara en un 10, 20, y 30 % respectivamente segn la categora, adems de
salir el precio total que ser el total de rea * el precio y si se escogi en tipo de alquiler
Contado se le har un Descuento de 10% al precio total y si es crdito se le har un
recargo de 15 %.

14- Finalmente se deber escoger si se pagara alumbrado, parques o serenazgo sacando


los % correspondientes al precio total segn indica el formulario el precio final deber
salir al hacer clic en el botan calcular.

15- Ingrese un numero y Genere las siguientes series: (el resultado se mostrara en un label
o en un text)
- 1,3,5,7,.....
- -1,+3,-5,+7...
- 1,3,2,5,3,7,4,9,5,11....
- 0,1,1,2,3,5,8,13...(Serie Fibonacci)

16- Genere 100 nmeros aleatorios y diga cuantos primos mayores a 50 hay, perfectos
menores a 10 hay, pares e impares.

Tcnica de Programacin Orientada a Objetos

230

17- Genere 100 nmeros aleatorios y al finalizar diga cual es el mayor y el menor.

18- Ingrese un numero de cualquier cifra y mostrarlo en forma invertida

19- Ingrese un numero y convirtalo en base 2

20- Ingrese una cadena y muestre lo siguiente:


- La cadena en forma invertida
- Diga cuantas vocales tiene
- Diga cuantos espacios en blancos hay

21- Ingrese una cadena y convirtalo en mayscula y en minsculas


funciones ucase y lcase.

sin utilizar las

22- Genere 10 nmeros aleatorios y si el numero es par se deber incrementar el numero


con la suma de su raz cuadrada, si el numero es impar se deber incrementar el
numero con la suma del seno del numero. AL finalizar se debe mostrar la suma de
todos los nmeros.

23- Ingrese Una fecha y diga cuantos das faltan para acabar el ao, cuantos das han
pasado desde esa fecha hasta la fecha actual, que da cae esa fecha (Lunes, martes),
y muestre la misma fecha en el siguiente formato: Lunes 15 de Abril de 2003 (Por
ejemplo)

24- Ingrese en una caja de texto una cadena y al finalizar diga cuantas palabras tiene dicha
cadena y cual es la cantidad de caracteres que tiene la palabra con mayor longitud

25- Ingrese un usuario y un password y si se equivoca


aplicacin

tres veces debe salir de la

26- Realice el siguiente formulario:


En este formulario se deber escoger un color y un objeto (checks,text, options) y al
hacer clic en fondo o en letra deber cambiar al color que se escogi ya sea el
fondo(backcolor o la letra(forecolor)
Luego al hacer clic en cursiva( font.italic) o en negrita (font.bold) o subrayado
(font.underline) se debera cambiar la apariencia de los controles que se escogio (Checks,
text ,Options)

Tcnica de Programacin Orientada a Objetos

231

27- Realice el siguiente formulario:

28- Cuando se haga clic en Mostrar Resultado se debe mostrar la edad del trabajador, el
tiempo de servicio y el cdigo que se generara de la siguiente manera: el ao de
ingreso luego la letra M o F segn su sexo , los 2 primeros caracteres de su apellido
paterno, los 2 primeros caracteres de su apellido materno, el primer carcter de su
nombre y un correlativo

29- Adems al ingresar sus nombres al perder el enfoque se deber cambiar el texto por
maysculas y al entrar al enfoque de algn texto el color de fondo deber cambiar y al
salir del enfoque deber regresar al color original que tuvo.

Tcnica de Programacin Orientada a Objetos

232

Contenido.

Introduccin a la Estructura de Datos


o Conceptos
o Operaciones: Asignacin y obtencin de valores. Recorrido por los
elementos de un Arreglo.

Metodologas de trabajo usadas en la construccin de aplicaciones con


Vectores y Matrices.

Los Arrays (trmino en ingls que se refiere a los Arreglos), en las versiones anteriores de
Visual Basic eran tipos de datos de los llamados por valor, al igual que lo son los tipos Integer,
Double, etctera. Pero en Visual Basic .NET, los arrays realmente son tipos por referencia.

Las variables que hemos estado usando hasta ahora, eran de tipo escalar: slo pueden
contener un valor a la vez, pero resulta que en ocasiones nos podemos ver en la necesidad de
querer tener en una misma variable, valores que de alguna forma estn relacionados. Por
ejemplo, si tenemos una coleccin de discos, nos podra interesar tener esa discografa incluida
en una misma variable para poder acceder a cualquiera de esos discos sin necesidad de tener
que crear una variable distinta para cada uno de los discos, ya que sera totalmente ineficiente
si, por ejemplo, quisiramos imprimir una relacin de los mismos.

Realmente para el ejemplo, hay otros tipos de datos que seran ms prcticos, pero cuando
veamos esos otros tipos de datos, sers t el que decida cual utilizar.

Una de las formas en las que podemos agrupar varios datos es mediante los arrays (o
matrices). Usando un array, podemos acceder a cualquiera de los valores que tenemos

Tcnica de Programacin Orientada a Objetos

233

almacenado mediante un ndice numrico. Por ejemplo, si tenemos la variable discografa y


queremos acceder al tercer disco, podramos hacerlo de la siguiente forma: discografa(3).

Sabiendo esto, podemos comprobar que sera fcil recorrer el contenido de los arrays mediante
un bucle For.

Qu tipos de datos se pueden usar para crear arrays?

Los tipos de datos de las variables usadas como array, pueden ser de cualquier tipo,
dependiendo de lo que queramos guardar. Por ejemplo, si queremos guardar los nombres de
los discos que tenemos, podemos usar un array del tipo String, que lo que nos interesa es
saber el porcentaje de goles por partido de nuestro equipo de ftbol favorito, el tipo de datos
del array poda ser Integer. Incluso si queremos, tambin podemos crear un array de un tipo
que nosotros hayamos definido o de cualquier clase que exista en el .NET Framework.

Declarar variables como arrays


Para poder indicarle al VB que nuestra intencin es crear un array podemos hacerlo de dos
formas distintas, para este ejemplo crearemos un array de tipo Integer:

1. La clsica (la usada en versiones anteriores)


Dim X() As Integer

2. La nueva forma introducida en .NET:


Dim X As Integer()

De cualquiera de estas dos formas estaramos creando un array de tipo Integer llamada X.
Cuando declaramos una variable de esta forma, slo le estamos indicando al VB que nuestra
intencin es que la variable a sea un array de tipo Integer, pero ese array no tiene reservado
ningn espacio de memoria.

Asignar valores a un array


Para asignar un valor a un elemento de un array, se hace de la misma forma que con las
variables normales, pero indicando el ndice (o posicin) en el que guardar el valor.

Tcnica de Programacin Orientada a Objetos

234

X(0)

10
12

X(2)
X(1)

X(3)

Por ejemplo, para almacenar el valor 3 en la posicin 3 del array X, haramos lo siguiente:

X(3) = 3

Acceder a un elemento de un array


A = B*X(3)

De igual forma, si queremos utilizar ese elemento que est en la posicin 3 para una operacin,
podemos hacerlo como con el resto de las variables, pero siempre usando el parntesis y el
nmero de elemento al que queremos acceder:

El ndice para poder acceder al elemento del array puede ser cualquier expresin numrica,
una variable o como hemos estado viendo en estos ejemplos, una constante. La nica
condicin es que el resultado sea un nmero entero.

Los lmites de los ndices de un array


Como ya he comentado antes, el ndice inferior de un array, siempre es cero, esto es
invariable, todos los arrays de .NET Framework empiezan a contar por cero.

Pero el ndice superior puede ser el que nosotros queramos, aunque sin pasarnos, que la
memoria disponible se puede agotar si pretendemos usar un valor exageradamente alto.

Tcnica de Programacin Orientada a Objetos

235

Saber el tamao de un array


Cuando tenemos un array declarado y asignado, podemos acceder a los elementos de ese
array mediante un ndice, esto ya lo hemos visto; pero si no queremos "pasarnos" cuando
queramos acceder a esos elementos, nos ser de utilidad saber cuntos elementos tiene el
array, para ello podemos usar la propiedad Length, la cual devuelve el nmero total de
elementos, por tanto, esos elementos estarn comprendidos entre 0 y Length - 1.

Esto es til si queremos acceder mediante un bucle For, en el siguiente cdigo se mostraran
todos los elementos del array a:

For i=0 to X.Length 1


Leer X(i)
Next

Inicializar un array al declararla


Al igual que las variables normales se pueden declarar y al mismo tiempo asignarle un valor
inicial, con los arrays tambin podemos hacerlo, pero de una forma diferente, ya que no es lo
mismo asignar un valor que varios.

Aunque hay que tener presente que si inicializamos un array al declararla, no podemos indicar
el nmero de elementos que tendr, ya que el nmero de elementos estar supeditado a los
valores asignados.

Para inicializar un array debemos declarar ese array sin indicar el nmero de elementos que
contendr, seguida de un signo igual y a continuacin los valores encerrados en llaves.

Veamos un ejemplo:

Dim X() As Integer = {4, 2, 5, 9, 10}

Dim X() As Integer = {4, 2, 5, 9, 10}


Tambin podemos hacerlo de esta otra forma:

Tcnica de Programacin Orientada a Objetos

236

Usando cualquiera de estas dos formas mostradas, el nmero de elementos ser 5, por tanto
los ndices irn desde 0 hasta 4.

Los arrays pueden ser de cualquier tipo


En el caso de que sean datos de tipo String, los valores a asignar debern estar entre comillas
dobles o ser variables de tipo String. Por ejemplo:

Dim Cad As String() = {"Hola", "Mundo", "te", "saludo"}


Cad(3)=Mario
For i=0 to Cad.Length -1
Leer Cad(i)
Next

Dim Cad As String() = {"Hola", "Mundo", "te", "saludo"}


Dim i as Integer
For Each i in Cad
Leer Cad(i)
Next

Usar un bucle For Each para recorrer los elementos de un array


El tipo de bucle For Each es muy til para recorrer los elementos de un array, adems de ser
una de las pocas, por no decir la nica, formas de poder acceder a un elemento de un array sin
indicar el ndice.

mbito de Alcance de los Arrays


Al igual que las variables, el array podr ser declarado en un mbito Local, Privado o Global,
dependiendo de la complejidad de la aplicacin o de los requerimientos, se tendr que usar el
mbito adecuado.

Tcnica de Programacin Orientada a Objetos

237

Aplicacin de ejemplo:

Disear un formulario (frmDistritos) que al iniciar muestre los distritos Ate, Barranco y
Cercado de Lima, que sean ledos desde un arreglo de nombre Distritos y sea mostrado en un
ListBox.

Declaramos el array Distritos con los elementos y una variable encargada de


contabilizar la cantidad de elementos que sern agregados, luego aadirlos al
listbox.
Public Class frmDistritos
Private distritos()as String={Ate,Barranco,Cercado
de Lima}
Private cont as Integer

Private Sub frmDistritos_Load(..)


Dim i As Integer
cant = distritos.Length
For i = 0 To distritos.Length - 1
lstLista.Items.Add(distritos(i))
Next
End Sub

Tcnica de Programacin Orientada a Objetos

238

Al agregar, se mostrar un cuadro de dilogo que permita agregar nuevos


distritos al arreglo, y luego mostrarlos nuevamente en el cuadro de lista.
Private Sub btnAgregar_Click(..)
Dim cad As String = InputBox("Nombre del Distrito:",
"Agregar")
If cad.Trim.Length > 0 Then
cant += 1
ReDim Preserve distritos(cant - 1)
distritos(cant - 1) = cad
lstLista.Items.Clear()
For i As Integer = 0 To distritos.Length - 1
lstLista.Items.Add(distritos(i))
Next
Else
MessageBox.Show("Escriba un nombre valido",
"Error", MessageBoxButtons.OK,
MessageBoxIcon.Information)
End If

End Sub

Tcnica de Programacin Orientada a Objetos

239

Al eliminar, se eliminara el elemento del arreglo y luego se mostrarn los


elementos del arreglo.

Private Sub btnEliminar_Click(..)


Dim item As Integer = lstLista.SelectedIndex
For i As Integer = item To distritos.Length - 1
If i <> distritos.Length - 1 Then
distritos(i) = distritos(i + 1)
End If
Next
cant -= 1
ReDim Preserve distritos(cant - 1)
------- Mostrar los elementos en el Listbox
lstLista.Items.Clear()
For cont As Integer = 0 To distritos.Length - 1
lstLista.Items.Add(distritos(cont))
Next
End Sub

Tcnica de Programacin Orientada a Objetos

240

Propiedades de los Arreglos


Entre las ms importantes tenemos:

1- Length.- Devuelve la cantidad de elementos que tiene un arreglo

Ejemplo :
Dim v(4) as String
v.length() esto devolvera 5 , ya que el arreglo v tiene 5 elementos (0 al 4)

2- Sort.- Ordena un arreglo. Se utiliza la clase Array

Ejemplo
Dim V(3) as Integer ={13,7,16}
Array.Sort(V) aqu la clase Array esta ordenado el Arreglo V

3- CopyTo.- Copia los datos de un arreglo a otro en una posicin dada.


Sintaxis: Arreglo1.CopyTo (Arreglo2, Posicin)

Ejemplo
Dim V1(3) as Integer ={13,7,16}
Dim V2(3) as Integer
V1.CopyTo(V2,0) Aqu se esta copiando en el arreglo V2 a partir de la posicin 0 los
datos que hay en el arreglo V1

4- GetUpperBound (Indice_Dimension).- Esta funcin devuelve el ndice mayor de un


arreglo.

Dim V(3) as Integer

Si nos damos cuenta el arreglo declarado es un arreglo de una dimensin.


Esta dimensin seria la dimensin 0
v.GetUpperBound(0) esto devolvera 3

Tcnica de Programacin Orientada a Objetos

241

Ahora si el arreglo tuviera2 dimensiones Dim M (2,3) as Integer, tendramos la


dimensin 0 (0 al 2) y la dimensin 1 (0 al 3)

M.GetUpperBound (0) esto devuelve 2


M.GetUpperBound (1) esto devuelve 3

5- GetLowerBound (Indice_Dimension).- Esta funcin devuelve el ndice menor de un


arreglo.

Casi siempre el ndice menor ser 0 al no ser que el arreglo empiece con otro ndice.

Tcnica de Programacin Orientada a Objetos

242

Aplicaciones.

1- Llene un vector de 5 elementos con nmeros aleatorios y mustrelos en un listbox

Private Sub Button2_Click(..)


Dim vec (4) As Integer Se declara el vector
Dim I As Int16
Dim N As Int16
Hacemos un for desde 0 hasta el ndice mayor del arreglo
For I = 0 To Vec.GetUpperBound(0)
Generamos el numero aleatorio
N = CInt (Rnd () * 100)
Guardamos el numero en el vector
Vec (I) = N
Agregamos al Listbox el dato del vector
Me.ListBox1.Items.Add(vec(I))
Next

End Sub

Tcnica de Programacin Orientada a Objetos

243

2- Ingrese un numero en una caja de texto, al hacer click en el botn Agregar se debe
de agregar el numero a un arreglo dinmico adems de mostrador en un listbox

Aqu se declara el arreglo que es dinmico (ntese que no va nada


entre los parntesis)
Private V () As Int16
Este procedimiento se encarga de llenar el listbox con los datos
que tiene el vector
Sub Listar()
Me.ListBox1.Items.Clear()
Dim i As Int16
Me.ListBox1.Items.Clear()
For i = 0 To V.GetUpperBound(0)
Me.ListBox1.Items.Add(V(i))
Next
End Sub
Private Sub Form2_Load(..)
Aqui se el asigna un elemento al vector (el ndice de ese
elemento ser 0) ni bien carga el formulario
ReDim Preserve V(0)
End Sub
Private Sub Button1_Click(..)

Tcnica de Programacin
Dim posOrientada
As Int16a Objetos
Capturamos el ndice mayor del arreglo
pos = V.GetUpperBound (0)

244

3- Llene un vector de 100 elementos con nmeros aleatorios sin que estos se repitan y
mustrelos en un listbox

Declaramos el vector
Private Vec (99) As Integer
Ahora creamos una funcin llamada BuscarItem, esta funcin recibir como
parmetro un numero y se buscara en todo el vector.
Si ese numero se encuentra la funcin devuelve True caso contrario False
Function BuscarItem(ByVal N%) As Boolean
Dim Estado As Boolean = False
Dim I As Integer
For I = 0 To Vec.GetUpperBound(0)
If Vec(I) = N Then
Estado = True
Exit For
End If
Next
BuscarItem = Estado
End Function
Private Sub Button1_Click(..)
Dim N As Int16
Dim J As Int16 = 0
Me.ListBox1.Items.Clear()
Aqu se inicia el bucle para llenar los datos al vector
Do While J <= Vec.GetUpperBound (0)
Se genera el numero aleatorio
N = CInt (Rnd () * 100)
Llamamos a la funcin BuscarItem y le enviamos el numero
generado si la funcin devuelve False quiere decir que no lo
encontr.
Si no lo encontr lo agrega al vector.
If Not BuscarItem(N) Then
Vec(J) = N

Tcnica de Programacin Orientada a Objetos

245

Ademas de agrega a la lista


Me.ListBox1.Items.Add (Vec (J))
J = J + 1
aumentamos el valor de la variable J que es la que esta controlando la
posicin del vector que se esta llenando
End If
Loop
End Sub
End Class

Tcnica de Programacin Orientada a Objetos

246

4- Llene un vector dinmico con nombres de pases.


Al hacer click en el botn Agregar se mostrara un INPUTBOX donde se debe de
ingresar el nombre del pas, inmediatamente se mostrara un mensaje indicando si se
quiere continuar alo cual si se responde Si se repetir el proceso.
El proceso terminara cuando se responda No

Adems hay un botn Buscar que mostrar un INPUTBOX donde se ingresara el nombre de un
pas, si ese pas existe en el arreglo se seleccionara del Listbox, caso contrario se mostrara un
mensaje indicando que No existe

Tcnica de Programacin Orientada a Objetos

247

Desarrollo
Se declara el arreglo dinmico
Private V () As String
Private Sub CmdAgregar_Click(..)
Dim Rpta As Integer, P As String
Dim I As Integer = 0
Empieza el proceso hasta que en el mensaje se responda No
Do
Se abre un cuadro de dialogo para ingresar un pas
P = InputBox ("Ingrese Pas")
Se agrega un elemento al vector
ReDim Preserve V (I)
Se agrega el pas al vector
V (I) = P
Se agrega el valor del vector al Listbox
Me.ListBox1.Items.Add (UCase (V (I)))
Se incrementa la variable I es la que controla la posicin
del elemento que se esta llenando en le vector
I = I + 1
Aqu se muestra el mensaje y la respuesta se guarda en la
variable Rpta (Son 2 posibles respuestas Si VbYes y No
VbNo)
Rpta = MsgBox ("Desea Continuar...?", MsgBoxStyle.Question +
MsgBoxStyle.YesNo, "Confirmar")
Loop Until Rpta = vbNo
End Sub
Private Sub CmdBuscar_Click(..)
Dim P As String
Dim Estado As Boolean = False
Se ingresa el pas a buscar
P = InputBox ("Ingrese pas a buscar")
Dim I%
For I = 0 To V.GetUpperBound(0)
Se busca y si e encuentra se selecciona el listbox

Tcnica de Programacin Orientada a Objetos

248

If UCase (P) = V (I) Then


Me.ListBox1.SelectedIndex = I
Estado = True

End If
Next
Al final si Estado es igual

False quiere decir que no se encontr

If Not Estado Then


MsgBox("No se encontr el pas", MsgBoxStyle.Critical,
"Advertencia")
End If
End Sub

Tcnica de Programacin Orientada a Objetos

249

5- Llene una matriz con nmeros aleatorios y mustrelos en un Listview


Private m (4, 4) As Integer Se declara la matriz
Este sub se encarga de llenar los datos de la matriz al Listview
Sub Llenar ()
Dim F%, C%
For F = 0 To m.GetUpperBound(0)
Me.ListView1.Items.Add(m(F, 0))
For C = 1 To m.GetUpperBound(1)
Me.ListView1.Items(F).SubItems.Add(m(F, C))
Next
Next
End Sub
Private Sub Form5_Load(..)
Dim F%, C%
For F = 0 To m.GetUpperBound(0)
For C = 0 To m.GetUpperBound(1)
m(F, C) = CInt(Rnd() * 100)
Next
Next
Me.ListView1.Columns.Add("1", 40, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("2", 40, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("3", 40, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("4", 40, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("5", 40, HorizontalAlignment.Center)
Me.ListView1.View = View.Details
Call Llenar()
End Sub

Tcnica de Programacin Orientada a Objetos

250

Bueno para este ejercicio 5 tenemos que tener en cuenta algo:


Se esta utilizando un Listview para poder mostrar los datos de la matriz, este control permite
tener varias columnas y filas como si se tratase de una tabla.

Para agrega una columna se hace lo sgte:


Me.ListView1.Columns.Add("1", 40, HorizontalAlignment.Center)

Aqu se esta agregando una columna llamada 1 que tiene de ancho 40 y su alineacin ser al
centro

Hay que tener en cuenta tambin:


Me.ListView1.View = View.Details

Esto hace que se vea las columnas, ya que sin esta propiedad no se podra ver los
encabezados de las columnas ni tampoco todas las filas creadas.

Ahora para llenar algo a un ListView se hace:


Me.ListView1.Items.Add(Peru)

En este ejemplo se esta agregando Per al listview, cada vez que se agrega un tem al
Listview este toma un ndice que empezara de 0.

Que pasara si queremos seguir llenando mas pases en la misma fila pero en otras columnas?
La sentencia seria esta
Me.ListView1.Items(0).SubItems.Add(Bolivia)

Notese esto: Items(0).SubItems.Add(Bolivia)

Aqu dice que Bolivia ser un SubItem de la fila 0 sea se mostrara en otra columna que no sea
la principal (La principal seria la columna 0)

6- Llene 2 matrices con nmeros aleatorios y en una tercera matriz guarde la suma de las
2 anteriores, muestre las matrices en Listview

Tcnica de Programacin Orientada a Objetos

251

Private m1(4, 4) As Integer


Private m2(4, 4) As Integer
Private m3(4, 4) As Integer

Se crea un procedimiento llamado FormatoLista es te recibe como


parmetro el listview y le dar el formato correspondiente
Sub FormatoLista(ByRef Lista As ListView)
Lista.Columns.Add("1", 40, HorizontalAlignment.Center)
Lista.Columns.Add("2", 40, HorizontalAlignment.Center)
Lista.Columns.Add("3", 40, HorizontalAlignment.Center)
Lista.Columns.Add("4", 40, HorizontalAlignment.Center)
Lista.Columns.Add("5", 40, HorizontalAlignment.Center)
Lista.View = View.Details
End Sub
Se crea un procedimiento llamado Llenar este recibe como
parmetro el listview y el arreglo al cual llenara el Listview
enviado
Sub Llenar(ByRef Lista As ListView, ByVal X(,) As Integer)
Dim F%, C%
For F = 0 To X.GetUpperBound(0)
Lista.Items.Add(X(F, 0))
For C = 1 To X.GetUpperBound(1)
Lista.Items(F).SubItems.Add(X(F, C))
Next
Next
End Sub

Tcnica de Programacin Orientada a Objetos

252

Private Sub Form6_Load(..)


Randomize()
Dim F%, C%
Aqui se llenan las 3 matrices con nmeros aleatorios
For F = 0 To m1.GetUpperBound(0)
For C = 0 To m1.GetUpperBound(1)
m1(F, C) = CInt(Rnd() * 100)
Next
Next
For F = 0 To m2.GetUpperBound(0)
For C = 0 To m2.GetUpperBound(1)
m2(F, C) = CInt(Rnd() * 100)
Next
Next
For F = 0 To m3.GetUpperBound(0)
For C = 0 To m3.GetUpperBound(1)
m3(F, C) = m1(F, C) + m2(F, C)
Next
Next
Call FormatoLista (Me.ListView1)
Se le da formato al ListView1
Call FormatoLista(Me.ListView2)
Call FormatoLista(Me.ListView3)

Call Llenar (Me.ListView1, m1)


Aqui se llena el Listview1 con la matriz m1
Call Llenar(Me.ListView2, m2)
Call Llenar(Me.ListView3, m3)
End Sub

Tcnica de Programacin Orientada a Objetos

253

7- Llene 1 matriz con nmeros aleatorios mustrela en un ListView, Al hacer click en el


botn Calcular se debe de mostrar la suma de su diagonal principal y secundaria.

Private m(4, 4) As Integer


Sub Llenar ()Este sub llena de la matriz al ListView
Dim F%, C%
For F = 0 To m.GetUpperBound(0)
Me.ListView1.Items.Add(m(F, 0))
For C = 1 To m.GetUpperBound(1)
Me.ListView1.Items(F).SubItems.Add(m(F, C))
Next
Next
End Sub

Private Sub Form7_Load(..)


Dim F%, C%
For F = 0 To m.GetUpperBound(0) Aqui se sella la matriz
For C = 0 To m.GetUpperBound(1)
m(F, C) = CInt(Rnd() * 10)
Next
Next
Se le da formato al ListView
Me.ListView1.Columns.Add("1", 40,
HorizontalAlignment.Center)
Me.ListView1.Columns.Add("2", 40,
HorizontalAlignment.Center)
Me.ListView1.Columns.Add("3", 40,
HorizontalAlignment.Center)
Me.ListView1.Columns.Add("4", 40,
HorizontalAlignment.Center)

Tcnica de Programacin Orientada a Objetos

Me.ListView1.Columns.Add("5", 40,
HorizontalAlignment.Center)

254

Se le da formato al ListView
Me.ListView1.Columns.Add("1", 40, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("2", 40, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("3", 40, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("4", 40, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("5", 40, HorizontalAlignment.Center)
Me.ListView1.View = View.Details
Call Llenar()
End Sub
Private Sub CmdCalcular_Click(..)
Dim F%, C%, Suma1%, Suma2%
For F = 0 To m.GetUpperBound(0)
For C = 0 To m.GetUpperBound(1)
If F = C Then
suma1 = suma1 + m(F, C)
End If
If F + C = 4 Then
Suma2 = Suma2 + m(F, C)
End If
Next
Next
Me.lbldiag1.Text = Suma1
Me.lbldiag2.Text = Suma2
End Sub

Tcnica de Programacin Orientada a Objetos

255

Ejercicios propuestos.

1- Al hacer clic en un botn Agregar se ingresara en un InputBox una cadena, esta


cadena se agregara a un vector dinmico y se mostrara en un listbox.

2- Luego se deber de ingresar Una letra en una caja de texto, al hacer clic en un botn
Buscar se debe de mostrar la cantidad de veces que se repite esa letra en todo el
arreglo dinmico.

3- Generar 100 nmeros aleatorios y guardarlos en un arreglo.


4- Al hacer clic en un botn Separar se deber de recorrer el arreglo anterior y se
separaran los pares de los impares en arreglos diferentes.
Los 3 arreglos se mostraran en un listbox

5- Llenar una matriz de 5 x 5 con nmeros aleatorios sin que estos se repitan, luego
mostrarlos en un ListView

6- Llenar un vector de 25 elementos con nmeros aleatorios, luego pasarlo a una matriz
de 5 x 5. Mostrar el arreglo en un listbox y la matriz en un Listview

7- Llenar 2 matrices de 5 x 5 con nmeros aleatorios, luego se deber de escoger entre


un grupo de opciones (Radiobutton) un signo de operacin que podr ser +, - , *, /.
Al hacer clic en un botn Calcular se deber de llenar una tercera matriz con la
operacin seleccionado entre la matriz 1 y la matriz 2, es decir si se escoge el signo +
por ejemplo se deber de sumar cada elemento de la matriz 1 con la matriz 2

5. Llenar un vector con nmeros aleatorios. Luego se debe de ingresar un nmero, si este
existe se debe de eliminar dicho nmero del arreglo. Utilice un arreglo dinmico.

Tcnica de Programacin Orientada a Objetos

256

Contenido.

Procedimientos y Funciones definidas por el Usuario


o Tipos de Procedimientos.
o Creacin de procedimientos Sub y Function.
o Parmetros por Valor y Referencia.
o Invocar procedimientos y funciones.
o Paso de matrices como argumentos.

Recursividad.

PROCEDIMIENTOS Y FUNCIONES DEFINIDAS POR EL


USUARIO
El desarrollo de una aplicacin, especialmente si se trata de un proyecto de gran tamao, es
ms fcil si se divide en piezas ms pequeas. El uso de procedimientos puede ayudarnos a
agrupar nuestro cdigo en secciones lgicas y condensar tareas repetidas o compartidas, como
clculos utilizados frecuentemente.
Los procedimientos son las sentencias de cdigo ejecutable de un programa. Las instrucciones
de un procedimiento estn delimitadas por una instruccin de declaracin y una instruccin
End.
Nota:
Es posible que encontremos los trminos mtodos, procedimientos y funciones de forma
intercambiable en varias referencias.

Tipos de Procedimientos.

Existen tres tipos de procedimientos en Microsoft Visual Basic .NET: procedimientos Sub,
procedimientos Function y procedimientos Property.

Tcnica de Programacin Orientada a Objetos

257

Los procedimientos Sub realizan acciones pero no devuelven un valor al procedimiento que
origina la llamada. Los controladores de eventos son procedimientos Sub que se ejecutan en
respuesta a un evento.
Los procedimientos Function pueden devolver un valor al procedimiento que origina la llamada.
La instruccin MessageBox.Show es un ejemplo de funcin.
Los procedimientos Property devuelven y asignan valores de propiedades de clases,
estructuras o mdulos.

Uso de Procedimientos.

Un procedimiento puede ser invocado, o llamado, desde otro procedimiento. Cuando un


procedimiento llama a otro procedimiento, se transfiere el control al segundo procedimiento.
Cuando finaliza la ejecucin del cdigo del segundo procedimiento, ste devuelve el control al
procedimiento que lo invoc.

Debido a esta funcionalidad, los procedimientos resultan tiles para realizar tareas repetidas o
compartidas. En lugar de escribir el mismo cdigo ms de una vez, podemos escribir un
procedimiento e invocarlo desde varios puntos de nuestra aplicacin o desde otras
aplicaciones.

Accesibilidad.

Utilizamos un modificador de acceso para definir la accesibilidad de los procedimientos que


escribimos (es decir, el permiso para que otro cdigo invoque al procedimiento). Si no
especificamos un modificador de acceso, los procedimientos son declarados public de forma
predeterminada.
La siguiente tabla muestra las opciones de accesibilidad para declarar un procedimiento dentro
de un mdulo:

Modificador de
acceso

Descripcin

Public

Ninguna restriccin de acceso

Friend

Accesible desde el programa que contiene la declaracin y desde


cualquier otro lugar del mismo ensamblado

Private

Accesible nicamente en el mdulo que contiene la declaracin

Nota.
El modificador de acceso Protected nicamente puede utilizarse en procedimientos declarados
dentro de una clase

Tcnica de Programacin Orientada a Objetos

258

Como crear procedimientos Sub


Un procedimiento Sub es una serie de instrucciones de Visual Basic delimitadas por las
instrucciones Sub y End Sub. Los procedimientos Sub realizan acciones pero no devuelven un
valor al procedimiento que origina la llamada.
Sintaxis para la creacin de procedimientos Sub
Utilicemos la siguiente sintaxis para crear un procedimiento Sub:
[accessibility] Sub subname[(argumentlist)]
' Statements of the Sub procedure go here
End Sub

Ejemplo de procedimientos Sub

El siguiente cdigo crea un procedimiento Sub (Sub AboutHelp) que utiliza un cuadro de
mensaje para mostrar un nombre de producto y un nmero de versin:
Private Sub AboutHelp( )
MessageBox.Show("MyProgram V1.0", "MyProgram Help")
End Sub

Creacin de procedimientos Function


Un procedimiento Function es una serie de instrucciones Visual Basic delimitadas por las
instrucciones Function y End Function. Los procedimientos Function son similares a los
procedimientos Sub, pero las funciones pueden devolver un valor al programa que origina la
llamada.

Sintaxis para crear a Function procedimiento

Utilicemos la siguiente sintaxis para crear un procedimiento Function:

[accessibility] Function functionname[(argumentlist)] As _


datatype
' Statements of the function go here, including optional
' Return statement
End Function

Tcnica de Programacin Orientada a Objetos

259

Ejemplo de un procedimiento Function


El siguiente cdigo crea una funcin denominada Square que devuelve el cuadrado de un
nmero entero (integer):
Function Square(SquareValue As Integer) As Integer
Square = SquareValue * SquareValue
End Function

Valores de retorno
El valor que devuelve un procedimiento Function al programa que origina la llamada se
denomina valor de retorno. La funcin devuelve el valor en una de las dos formas siguientes:
-

Asigna un valor al nombre de su propia funcin en una o ms instrucciones dentro


del procedimiento. El control no se devuelve al programa que origina la llamada
hasta que se ejecuta una instruccin Exit Function o End Function.
La instruccin Exit Function provoca la salida inmediata de un procedimiento
Function. Cualquier nmero de instrucciones Exit Function pueden aparecer en
cualquier lugar del procedimiento.

Utiliza una instruccin Return para especificar el valor devuelto, y devuelve el


control inmediatamente al programa que origina la llamada.

La ventaja de asignar el valor devuelto al nombre de funcin es que el control no se devuelve


desde la funcin hasta que el programa encuentra una instruccin Exit Function o End
Function. Esto permite asignar un valor preliminar y ajustarlo ms tarde si es necesario.

Ejemplo de asignacin del valor de retorno


El siguiente ejemplo asigna el valor de retorno al nombre de funcin DoubleTheValue y utiliza
la instruccin Exit Function para volver al procedimiento de llamada:
Function DoubleTheValue(ByVal j As Integer) As Double
...
DoubleTheValue = j*2
' Control remains within the function
...
Exit Function
' Control returns to the calling function
...
End Function

Tcnica de Programacin Orientada a Objetos

260

Si salimos de la funcin sin asignar un valor devuelto, la funcin devuelve el valor


predeterminado apropiado para el tipo de datos de la funcin. Por ejemplo, devuelve 0 para
Byte, Char, Decimal, Double, Integer, Long, Short y Single.

Ejemplo de uso de la instruccin Return


La instruccin Return asigna simultneamente el valor devuelto y sale de la funcin, como se
muestra en el siguiente ejemplo:

Function DoubleTheValue(ByVal j As Integer) As Double


...
Return j*2
' Control is immediately returned to the calling function
...
End Function

Cmo declarar argumentos en procedimientos


Un procedimiento que realiza tareas repetidas o compartidas utiliza distinta informacin en
cada llamada. Esta informacin puede estar formada por variables, constantes y expresiones
que se pasan al procedimiento por el procedimiento que origina la llamada. Cada valor que se
pasa a un procedimiento se denomina argumento.

Parmetros vs. argumentos


Cuando definimos un procedimiento en Visual Basic .NET, describimos los datos y los tipos de
datos para los que el procedimiento est diseado para aceptar desde un procedimiento de
llamada. Los elementos definidos en el procedimiento se denominan parmetros.

Cuando invocamos el procedimiento, sustituimos un valor actual de cada parmetro. Los


valores que asignamos en lugar de los parmetros se denominan argumentos.

Nota
A pesar de esta sutil diferencia, los trminos argumento y parmetro a menudo se utilizan
indistintamente. Este mdulo utiliza la terminologa utilizada en la documentacin de Visual
Studio .NET.

Tcnica de Programacin Orientada a Objetos

261

Paso ByVal y ByRef


Cuando definimos un procedimiento, definimos el modo en el que otros procedimientos pueden
pasar argumentos al procedimiento. Podemos escoger pasarle argumentos por referencia
(ByRef) o por valor (ByVal). En Visual Basic .NET, el mecanismo predeterminado de paso de
parmetros es por valor. Si no especificamos ByVal ni ByRef en nuestras definiciones de
parmetros, ByVal se aade automticamente a la definicin del parmetro.
Mecanismo
de paso
Por valor
Palabra
clave: ByVal

Por
referencia
Palabra
clave: ByRef

Explicacin

Implicaciones

Ventaja

El procedimiento
invocado recibe una
copia de los datos
cuando es invocado.

Si el procedimiento invocado
modifica la copia, el valor
original de la variable
permanece intacto. Cuando la
ejecucin retorna al
procedimiento de llamada, la
variable contiene el mismo
valor que tena antes de que el
valor se pasara.

Protege la variable
de ser cambiada por
el procedimiento
invocado.

El procedimiento
invocado recibe una
referencia a los datos
originales (la direccin
de los datos en
memoria) cuando es
invocado.

El procedimiento invocado
puede modificar la variable
directamente. Cuando la
ejecucin retorna al
procedimiento de llamada, la
variable contiene el valor
modificado.

El procedimiento
invocado puede
utilizar el argumento
para devolver un
nuevo valor al
cdigo de llamada.

Excepciones
El elemento de programacin que subyace en un argumento puede ser un elemento variable,
cuyo valor puede ser cambiado, o un elemento no variable. Los argumentos no variables nunca
son modificados en el cdigo de llamada, aunque se pasen por referencia. El procedimiento
invocado podra modificar su copia de ese argumento, pero la modificacin no afectara al
elemento subyacente en el cdigo de llamada.

La siguiente tabla muestra elementos variables y no variables.

Elementos variables (pueden modificarse)

Elementos no variables

Variables declaradas, incluyendo variables de objetos

Constantes

Campos (de clases)

Literales

Elementos de matrices

Enumeraciones

Elementos de estructuras

Expresiones

Tcnica de Programacin Orientada a Objetos

262

Declarar argumentos

Utilizamos la misma sintaxis para declarar los argumentos para procedimientos Sub y
procedimientos Function. Declaramos cada argumento de un procedimiento del mismo modo
en que declaramos una variable, especificando el nombre del argumento y el tipo de datos.
Tambin podemos especificar el mecanismo de paso y si el argumento es opcional.

La sintaxis para cada argumento en la lista de argumentos de un procedimiento es como sigue:


([ByVal|ByRef] [ParamArray] nombreargumento As datatype)

Nota
Si el argumento es opcional, debemos incluir tambin la palabra clave Opcional y proporcionar
un valor predeterminado en la declaracin, como sigue:
Opcional [ByVal|ByRef] nombreargumento As datatype = defaultvalue

Ejemplo de declaracin de un argumento

En el siguiente ejemplo, el procedimiento Sub Hello est diseado para tomar un argumento
Name de tipo String por valor desde un procedimiento de llamada.

Public Sub Hello(ByVal Name As String)


MessageBox.Show("Hello, " & Name & "!")
End Sub

Nota
No es necesario que los nombres de argumentos utilizados cuando se invoca un procedimiento
coincidan con los nombres de parmetros utilizados para definir el procedimiento.

Tcnica de Programacin Orientada a Objetos

263

Cmo utilizar argumentos opcionales


Podemos especificar que el argumento de un procedimiento es opcional y no es necesario
proporcionarlo cuando el procedimiento es invocado. Esto ofrece flexibilidad cuando nuestro
procedimiento es invocado por otro procedimiento. El usuario puede decidir proporcionar o no
un argumento.

Declarar un argumento opcional


Los argumentos opcionales estn indicados por la palabra clave Optional en la definicin del
procedimiento. Adems, cuando declaramos un argumento opcional, se aplican las siguientes
reglas:

Debe especificarse un valor predeterminado para todos los argumentos opcionales.


El valor predeterminado de un argumento opcional debe ser una expresin
constante.
Todos los argumentos que sigan a un argumento opcional en la definicin del
procedimiento tambin deben ser opcionales.

El siguiente cdigo muestra la sintaxis para declarar un argumento opcional:


Optional [ByVal|ByRef] nombreargumento As datatype = defaultvalue

Ejemplo de argumento opcional


El siguiente ejemplo muestra una declaracin de procedimiento con un argumento opcional:

Function Add(ByVal value1 As Integer, ByVal value2 As _


Integer, Optional ByVal value3 As Integer = 0) As Integer
' The default valor for the optional argument is 0

Ejemplo de argumento opcional incorrecto


El siguiente ejemplo contiene un error; recordemos que los argumentos que siguen a un
argumento opcional tambin deben ser opcionales.

Function Add(ByVal value1 As Integer, Optional ByVal _


value2 As Integer = 0, ByVal value3 As Integer) As Integer
' Causes an error

Tcnica de Programacin Orientada a Objetos

264

Procedimientos de llamada con argumentos opcionales

Cuando invocamos un procedimiento con un argumento opcional, podemos escoger entre


proporcionar o no el argumento. Si no proporcionamos el argumento, el procedimiento utiliza el
valor predeterminado declarado para ese argumento.

Cuando omitimos uno o ms argumentos opcionales en la lista de argumentos, utilizamos


comas sucesivas para separar los espacios marcando sus posiciones. La siguiente invocacin
proporciona los argumentos primero y cuarto, pero no proporciona el segundo ni el tercero:

SubCount(arg1, , , arg4)
' Leaves out arg2 and arg3

Reutilizacin de cdigo
Uno de los procesos ms importantes en la creacin de una aplicacin basada en Visual Basic
es disear cdigo para su reutilizacin. El modo como escribimos el cdigo afecta a su
reutilizacin.

Escribir cdigo para reutilizar


Podemos escribir cdigo para ser reutilizado, incluyendo procedimientos, en estructuras,
mdulos o clases. La siguiente tabla proporciona una descripcin de las situaciones en las que
deberamos escoger cada una de estas opciones:

Usar
un(a)

para

Ejemplo

Estructura

Crear objetos que no necesitan


ser extendidos y que tienen un
tamao de instancia pequeo

Size y Point son estructuras disponibles


en la biblioteca de clases del Microsoft
.NET Framework

Mdulo

Proporcionar funciones de
utilidad y datos globales para su
uso por mltiples mdulos o
clases

Funciones de utilidad como conversin


de temperatura, clculo de rea, acceso
a datos, etc., necesarias para mltiples
mdulos

Clase

Extender objetos, o para objetos


que necesitan liberar recursos

Clase Forms, clase Button, etc.

Tcnica de Programacin Orientada a Objetos

265

Escribir procedimientos en una estructura


El siguiente cdigo muestra cmo podemos escribir un procedimiento en una estructura.
Asumimos que las variables x, y y z del ejemplo ya han sido declaradas.

Structure TableDimensions
Private legHeight, topWidth, topDepth As Integer
Public Sub New(ByVal legHeight As Integer, _
ByVal topWidth As Integer, ByVal topDepth as Integer)
Me.legHeight = x
Me.topWidth = y
Me.topDepth = z
End Sub
End Structure

Tcnica de Programacin Orientada a Objetos

266

Crear un mdulo
Para crear un mdulo, aadimos primero un mdulo a nuestro proyecto. A continuacin,
escribimos las instrucciones del cdigo que definen los datos y procedimientos de nuestro
mdulo.

Aadir un mdulo a un proyecto


o
o
o

Si el Explorador de soluciones no est abierto, en el men Ver, hacer clic en


Explorador de soluciones.
En el Explorador de soluciones, hacer clic con en botn derecho en nuestro
proyecto, seleccionar Agregar y, a continuacin, hacer clic en Agregar nuevo
elemento.
En el cuadro de dilogo Agregar nuevo elemento, en el cuadro Nombre,
escribir un nombre para su mdulo, seleccione Mdulo en las Plantillas y, a
continuacin, hacer clic en Abrir.

Sintaxis
La siguiente sintaxis declara un bloque de mdulo:

[Public|Friend] Module nombremdulo


' Add classes, properties, methods, fields, and events for
' the module
End Module

Accesibilidad de un mdulo

Al igual que con los procedimientos y las variables, utilizamos los modificadores de acceso para
definir la accesibilidad de un mdulo. Si no utilizamos un modificador de acceso, los mdulos
se declaran Friend de modo predeterminado.

La siguiente tabla define los modificadores de acceso disponibles para un mdulo:

Modificador de
acceso

Definicin

Public

Ninguna restriccin de acceso

Friend

Accesible desde dentro del programa que contiene la declaracin y


desde cualquier lugar del mismo ensamblado

Tcnica de Programacin Orientada a Objetos

267

Uso de procedimientos
Uno de los principales beneficios del uso eficaz de procedimientos es la reutilizacin de cdigo.
Los procedimientos que creamos en un programa pueden utilizarse en ese programa y en otros
proyectos, frecuentemente con poca o nula modificacin. Los procedimientos son tiles para
tareas repetidas o compartidas, como clculos utilizados frecuentemente.

Cmo utilizar los procedimientos Sub


Para utilizar un procedimiento Sub, lo invocamos desde otro procedimiento.

Flujo de cdigo

Cada vez que se invoca un procedimiento Sub, se ejecutan sus instrucciones, empezando por
la primera instruccin ejecutable despus de la instruccin Sub y finalizando con la primera
instruccin End Sub, Exit Sub o Return encontrada. Despus de que el procedimiento Sub
ejecute nuestro cdigo, devuelve la ejecucin del programa a la lnea de cdigo que sigue a la
lnea que invoc el procedimiento Sub.

Invocar un procedimiento Sub


La sintaxis para invocar un procedimiento Sub es la siguiente:

[Call] Subname [(Argumentlist)]

Debemos invocar el procedimiento Sub en una lnea por s mismo en nuestro


cdigo (no puede invocarlo utilizando su nombre dentro de una expresin).
La instruccin de llamada debe proporcionar valores para todos los argumentos
que no son opcionales.
Opcionalmente, podemos utilizar la instruccin Call para invocar un procedimiento
Sub. El uso de la instruccin Call puede mejorar la legibilidad de nuestro programa.

Tcnica de Programacin Orientada a Objetos

268

Nota
Los procedimientos Sub no devuelven un valor a la instruccin de llamada. Sin embargo, un
procedimiento Sub pasar informacin de retorno al cdigo de llamada modificando argumentos
pasados por referencia.

Ejemplo de una invocacin simple

El siguiente cdigo muestra un procedimiento de evento que invoca un procedimiento Sub


denominado SetData:

Sub DataButton_Click(...)
SetData( )
End Sub

Ejemplo de uso de la instruccin Call

Tambin puede utilizar el siguiente cdigo para realiza la misma tarea:


Sub DataButton_Click(...)
Call SetData( )
End Sub

Ejemplo de invocacin simple incorrecta

La siguiente invocacin contiene un error:

Sub DataButton_Click(...)
MessageBox.Show(SetData( ))
End Sub
' Causes an error, because the Show method expects a String
' data type, not un procedure

Tcnica de Programacin Orientada a Objetos

269

Ejemplo de invocacin con argumentos

Observe la siguiente definicin para el procedimiento Sub SetData:

Public Sub SetData(ByVal cars As Integer, ByVal trucks As _ Integer, ByVal vans As
Integer)
' Code for SetData Procedure
End Sub

La sintaxis para invocar este procedimiento incluye el nombre del procedimiento y la lista de
argumentos en parntesis, como se muestra en el siguiente cdigo:

Sub DataButton_Click(...)
SetData(10, 20, 30)
End Sub

Ejemplo incorrecto de una llamada con argumentos

La siguiente llamada al procedimiento SetData definido en el ejemplo a continuacin contiene


un error.

Sub DataButton_Click( )
SetData(10, 20)
End Sub
' Causes an error, because there is no valor for the third
' parametre of the SetData procedure. The calling statement
' must provide values for all arguments that are not optional.

Tcnica de Programacin Orientada a Objetos

270

Cmo utilizar los procedimientos Function


Un procedimiento Function se diferencia de un procedimiento Sub en que el primero puede
devolver un valor al procedimiento de llamada.

Invocar una funcin

Invocamos un procedimiento Function incluyendo su nombre y sus argumentos en el lado


derecho de una instruccin de asignacin o en una expresin. Piense en la siguiente funcin,
que convierte una temperatura en Fahrenheit a una temperatura en Celsius.

Function FtoC(ByVal temperature As Single) As Single


' Convert Fahrenheit to Celsius
FtoC = (temperature - 32.0) * (5 / 9)
End Function

Las siguientes llamadas de ejemplo muestran cmo podramos invocar esta funcin:

Dim celsiusTemperature As Single


celsiusTemperature = FtoC(80)
' Call the procedure by including its name and arguments on
' the right side of an assignment statement. In this call,
' the value 80 is passed to the FtoC function, and the
Tcnica de Programacin Orientada a Objetos

271

' value returned is assigned to celsiusTemperature.


If FtoC(userValue) < 0 Then . . .
' Call the procedure by using it in an expression. In this
' call, the FtoC function is used as part of an expression.
End If

Flujo de cdigo
Cada vez que se invoca la funcin se ejecutan sus instrucciones, empezando por la primera
instruccin ejecutable tras la instruccin Function y finalizando con la primera instruccin End
Function, Exit Function o Return encontrada.

Cmo pasar matrices a procedimientos


Podemos pasar matrices como argumentos a un procedimiento igual que otros argumentos.
Visual Basic .NET tambin proporciona la palabra clave ParamArray para declarar una matriz
de parmetros en la definicin de parmetros de un procedimiento.

Pasar matrices
Podemos pasar matrices unidimensionales o multidimensionales a procedimientos del mismo
modo que pasamos otros argumentos.
El siguiente ejemplo muestra cmo pasar una matriz unidimensional a un procedimiento:

Sub PassArray(ByVal testScores As Integer( ))


...
End Sub
Dim scores( ) As Integer = {80, 92, 73}
PassArray(scores)

Tcnica de Programacin Orientada a Objetos

272

El siguiente ejemplo muestra cmo pasar una matriz bidimensional a un procedimiento:


Sub Pass2DArray(ByVal rectangle As Integer(,))
...
End Sub
Dim rectangle(,) As Integer = {{12, 1}, {0, 12}}
Pass2DArray(rectangle)

Uso de ParamArray

Normalmente, no podemos invocar un procedimiento con ms argumentos de los especificados


en su declaracin. Cuando necesitamos un nmero indefinido de argumentos, podemos
declarar una matriz de parmetros, que permite que un procedimiento acepte una matriz de
valores para un argumento. No es necesario conocer el nmero de elementos de la matriz de
parmetros cuando definimos el procedimiento. El tamao de la matriz est determinado de
forma individual por cada invocacin al procedimiento.

Utilizamos la palabra clave ParamArray para denotar una matriz de parmetros. Esta palabra
clave indica que el argumento de un procedimiento es una matriz opcional de elementos de un
tipo especificado. Se aplican las siguientes reglas:

Un procedimiento slo puede tener una matriz de parmetros, y debe ser el ltimo
argumento de la definicin del procedimiento.
La matriz de parmetros debe pasarse por valor. Es una buena prctica de
programacin incluir explcitamente la palabra clave ByVal en la definicin del
procedimiento.
El cdigo dentro del procedimiento debe tratar la matriz de parmetros como una
matriz unidimensional, siendo cada elemento de la misma el mismo tipo de datos
que el tipo de datos ParamArray.
La matriz de parmetros es automticamente opcional. Su valor predeterminado es
una matriz unidimensional vaca del tipo de elemento del parmetro de la matriz.
Todos los argumentos que preceden a la matriz de parmetros deben ser
obligatorios. La matriz de parmetros debe ser el nico argumento opcional.

Invocar un procedimiento con un argumento de matriz de parmetros


Cuando invocamos un procedimiento con un argumento de matriz de parmetros, podemos
pasar alguna de las opciones siguientes para la matriz de parmetros:

Nada. Es decir, podemos omitir el argumento ParamArray. En este caso, se pasa


al procedimiento una matriz vaca. Tambin podemos pasar la palabra clave
Nothing, produciendo el mismo efecto.

Tcnica de Programacin Orientada a Objetos

273

Una lista de un nmero indefinido de argumentos, separados por comas. El tipo de


datos de cada argumento debe ser implcitamente convertible al tipo de elemento
ParamArray.
Una matriz con el mismo tipo de elemento que la matriz de parmetros.

Ejemplo de declaracin ParamArray


El siguiente cdigo muestra cmo podemos definir un procedimiento con una matriz de
parmetros:

Sub StudentScores(ByVal name As String, ByVal ParamArray _


scores( ) As String)
' Statements for Sub procedure
End Sub

Ejemplos de invocaciones a un procedimiento con una matriz de parmetros


Los siguientes ejemplos muestran invocaciones posibles a StudentScores.

StudentScores("Anne", "10", "26", "32", "15", "22", "16")


StudentScores("Mary", "High", "Low", "Average", "High")
Dim JohnScores( ) As String = {"35", "Absent", "21", "30"}
StudentScores("John", JohnScores)

Cmo crear un Sub Main


Para abrir y cerrar una aplicacin, la biblioteca de clases del .NET Framework proporciona la
clase Application. La clase Application proporciona mtodos (procedimientos) y propiedades
para gestionar una aplicacin, incluyendo mtodos para abrir y cerrar una aplicacin, mtodos
para procesar mensajes de Microsoft Windows, y propiedades para obtener informacin
sobre una aplicacin.

El procedimiento Sub Main


Cuando creamos aplicaciones con la plantilla Aplicacin para Windows en Visual Basic .NET,
Visual Basic crea automticamente un procedimiento Sub oculto denominado Sub Main para la
clase Form. Este procedimiento se utiliza como punto de inicio para nuestra aplicacin.

Tcnica de Programacin Orientada a Objetos

274

Crear un nuevo Sub Main


En el procedimiento Sub Main, Visual Basic .NET invoca el mtodo Application.Run para iniciar
la aplicacin. Podemos cambiar este comportamiento creando nuestro propio Sub Main y
convirtindolo en el objeto de inicio. Podemos crear Sub Main en un mdulo o en otra clase.
Despus de crear un Sub Main, necesitamos hacer de este nuevo procedimiento el objeto de
inicio utilizando la ventana Propiedades.

Cambiar el objeto de inicio a Sub Main


Si el Explorador de soluciones no est abierto, en el men Ver, hacer clic en
Explorador de soluciones.
En el Explorador de soluciones, hacer clic con el botn derecho en el nombre del
proyecto y, a continuacin, en Propiedades.
En el panel izquierdo, debajo de Propiedades comunes, verificar que est
seleccionado General.
En la lista Objeto inicial, hacer clic en Sub Main para convertir este procedimiento
el nuevo objeto de inicio de nuestro proyecto.

Tcnica de Programacin Orientada a Objetos

275

Utilizacin de Application.Exit
Para cerrar una aplicacin, invocamos el mtodo Application.Exit utilizando la siguiente
sintaxis:

Application.Exit( )
Por ejemplo, podemos insertar este cdigo en el controlador de eventos Click de un botn.
Cuando el usuario haga clic en el botn, la aplicacin se cerrar.

Los eventos Form.Closed y Form.Closing no se lanzan cuando se invoca el mtodo


Application.Exit para cerrar la aplicacin. Si hay cdigo en estos eventos que deba ser
ejecutado, invocar el mtodo Form.Close para cada formulario abierto individualmente antes de
invocar el mtodo Application.Exit.
Aplicaciones

Private intSum As Integer


Public Function minimo(ByVal ParamArray obj() As Integer) As
Integer
Dim z, con, min As Integer
con = 1
For Each z In obj
If con = 1 Then Min = z
If z < Min Then Min = z
con = con + 1
Next
Return Min
End Function

Sub Sum(ParamArray Nums() as integer)

Dim y,x As Integer


For Each x In Nums

Acepta un arreglo de datos y pueden ser


de cualquier tipo, nums es una variable
cualquiera receptor de datos

y = y + x
Llamado a la
procedimiento

Next x

funcion

al

intSum = y
End Sub

Private Sub Cmdcalculo_Click()


Sum Text2, Text3, Text4
Lbr1.Caption = intSum
Lbr2.Caption = minimo(Textbox1.text, Textbox2.text,
Textbox3.text)
Lbr3.Caption = minimo(5,7,3,8)
'la suma de 3 valores
Sum Text1, Text3, Text4
MsgBox "la suma del texto 1,3y 4

" & intSum

End Sub

Tcnica de Programacin Orientada a Objetos

277

Ejercicios propuestos

1- Escribir una funcin que dados a y b enteros devuelva ab.

2- Escribir una funcin que dado un nmero entero, devuelva una seal que indique si
dicho nmero es primo o no.

3- Escribir una funcin que dados 2 nmeros, calcule el porcentaje que el primero
representa respecto del segundo.

4- Escribir una funcin que dados a y b devuelva el cociente de la divisin entera, sin
utilizar el operador correspondiente del lenguaje. Validar los tipos de datos de entrada.

5- Escribir una funcin que dados a y b devuelva el resto de la divisin entera, sin utilizar
el operador correspondiente de lenguaje. Validar los tipos de datos de entrada.

6- Escribir una funcin que dado un cdigo numrico de m dgitos, separe un sub-cdigo
consistente en una cantidad n<m de dgitos a partir del k-simo lugar a contar del dgito
menos significativo. Utilizarla en un programa que ingrese un listado de cdigos
numricos junto con sus correspondientes parmetros m,n y k y liste dichos cdigos
de entrada junto con el sub-cdigo deseado.

7- Un nmero entero positivo se dice perfecto si es igual a la suma de todos sus divisores,
excepto el mismo.

8- Ejemplo: los nmeros 6 (1+2+3), 28 (1+2+4+7+14) y 496 (1+2+4+8+16+31+62+124


+248)

Se pide:
a) Escribir una funcin booleana que llamada desde un programa, permita discernir si
un nmero (nico parmetro) es perfecto.
b) Dar un ejemplo de cmo se hace referencia a dicha funcin desde un programa o
desde otro subprograma.
Nota: no usar variables globales.
8) Dos nmeros se dicen amigos cuando uno de ellos es igual a la suma de todos los
divisores
del otro excepto el mismo.
Ejemplo: los nmeros 220 (1+2+4+5+10+11+20+22+44+55+110=284)
y 284 (1+2+4+71+142=220) son amigos.

Tcnica de Programacin Orientada a Objetos

278

Se pide:
a) escribir una funcin booleana que llamada desde un programa, permita discernir si
dos nmeros (parmetros) son amigos.
b) Usar otra funcin para calcular la suma de los divisores de un nmero determinado.
c) Hacer referencia a dichas funciones desde un programa o desde otro subprograma.

Desarrollar los siguientes procedimientos cuyos nombres y parmetros por valor


se detallan en cada procedimiento:

1. Funcin pasando como parmetro un nmero de mes (1 al 12), devuelva la cantidad de


das de 1dicho Mes, considere el presente ao.

2. Funcin CUENTAVOCALES el cual pasando como parmetro una frase devuelva la


cantidad de vocales contenidas en dicha frase.
Ejemplo CUENTAVOCALES(VISUAL BASIC) -------- 5

3. Pasando como parmetro la base y la altura de un tringulo rectngulo devuelva su


hipotenusa.

4. Funcion MINIMO pasando tres valores numericos de tipo entero que devuelva el menor de
los tres numeros

5. Funcion MCD, pasando dos valore numericos, visualice el Maximo Comun Divisor de los
numeros

6. Funcin
SEGPALABRA el cual pasando como parmetro una FRASE, devuelva la
segunda palabra de dicha frase Ejemplo: SEGPALABRA(CURSO VISUAL BASIC) ------- VISUAL

7. Funcin PRIMO pasando por valor un nmero entero devuelva True si el nmero es
Primo y False si el nmero no es primo.

8. Pasando un monto en soles y el tipo de cambio, devuelva el monto convertido a Dlares.

9. Pasando tres nmeros devuelva el Mnimo Comn Mltiplo, de dichos nmeros.

10. Pasando un nmero entero de cualquier longitud, devuelva el promedio de dichas cifras.

11. Pasando un nmero entero de cualquier longitud, devuelva el dgito mayor.

Tcnica de Programacin Orientada a Objetos

279

12. Pasando un nmero entero de cualquier longitud, devuelva el mismo valor de manera
ordenada.

13. Pasando un nmero de Mes que devuelva dicho Mes en Letras.

14. Pasando una cadena, una posicin inicial y el nmero de caracteres a borrar ELIMINE una
subcadena de dicha cadena a partir de una posicin especificada.
Ejemplo : DELETEAR(VISUAL BASIC, 7, 6) ---- VISUAL

15. Pasando tres nmeros que representan el da, mes y ao devuelva una fecha como
cadena.
Ejemplo: FECHA(02, 12, 03) ---- 02 de Diciembre del 2003

16. Pasando un valor entero de grados centgrados y un carcter ( R, K, F) que


representan Ranking, Kelvin y Fahrenheit respectivamente, devuelva su valor de
conversin al grado especificado.

Tcnica de Programacin Orientada a Objetos

280

Recursividad
Propiedad que tienen los subprogramas de poder ser re-invocados sin haber finalizado el
proceso de las sentencias correspondientes a una invocacin previa de si mismo. El concepto
deriva del de Relacin Recurrente.

En toda relacin recurrente / proceso recursivo se distinguen dos partes bien diferenciadas:

Caso Base

: aquel que queda definido en si mismo.

Caso Recursivo

: basado en un caso base o en otro caso recursivo.

Tipos de Recursividad

Directa : es aquella en la que la invocacin recursiva se efecta desde dentro del


mismo modulo invocado.

Subprograma 1

Indirecta
modulo.

: es aquella donde la invocacin recursiva la efecta un segundo

Subprograma 1
Subprograma 2

Tcnica de Programacin Orientada a Objetos

281

Cmo funciona?
Cuando un subprograma se invoca a s mismo lo hace como si estuviera invocando a otro
subprograma, y en esto se cumplen todas las reglas de invocacin de subprogramas por parte
de otros subprogramas.

Es decir, todas las variables locales al programa invocante se almacenarn en el Stack, las
variables del programa invocado (el mismo) se inicializarn a basura y los parmetros tomaran
su valor correspondiente. Una vez finalizado el proceso, y no habiendo otra llamada recursiva,
se restauraran los valores de las variables del modulo invocante y se proseguir su ejecucin.

Ejemplos:

Forma Matemtica
Factorial

Implementacin Basic
Function fact(n as Integer) as Long

If n>0 then

f(n) = n * f(n-1) n>0

Fact=N*Fact(N 1)

f(0) = 1

Else
Fact=1
End Function

Fibonaci

f(n) = f(n-1) * f(n-2)

n>1

Function Fib( N as Integer) as Long

f(n) = 1

n<=1

If N>1 Then
Fib=Fib(N-1)+Fib(N-2)
Else
Fib=1
End If

Ejemplos a desarrollar: Factorial, Fibonnaci, Producto de dos nmeros, suma empleando


recursividad: (en Modulo.vb)

Tcnica de Programacin Orientada a Objetos

282

1. Implementar una funcin recursiva que devuelva el factorial de un nmero.

Public Function factorial(n As Integer) As Double


If n = 0 Then
factorial = 1
Else
factorial = n * factorial(n - 1)
End If
End Function

2. Implementar una funcin recursiva que calcule la serie de Fibonacci.

Function fibo(n As Integer) As Long


If n > 1 Then
fibo = fibo(n - 2) + fibo(n - 1)
Else
fibo = 1

Ejercicios Propuestos
1. Definir una funcin recursiva que dado un nmero entero, devuelva la suma de sus cifras.
Utilizarla para definir si un nmero es divisible por 3.

2. Definir una funcin recursiva que calcule w elevado a la k


sucesivas. (k natural)

mediante multiplicaciones

3. Definir una funcin recursiva que devuelva la cantidad de dgitos de un nmero entero.

4. Definir una funcin recursiva que calcule z * y mediante sumas sucesivas.

5. Definir una funcin recursiva para cada uno de los siguientes problemas
a) Calcular el promedio de los elementos del vector V de dimensin N.
b) Buscar el mnimo elemento del vector V de dimensin N.
c) Devolver la posicin del mximo elemento del vector V de dimensin N.

Tcnica de Programacin Orientada a Objetos

283

Contenido.

Funciones de Sistema
o Cadena
o Numericos
o Fecha

Formatenado la salida

FUNCIONES DE SISTEMA
Funciones de cadenas
Se denomina CADENA a una sucesin de caracteres. Una cadena puede tener uno o
varios caracteres alfanumricos. Una cadena es tambin una sucesin de nmeros.

Str(Expresin)
Cuando los nmeros se conviertan a cadenas, siempre se reservar un espacio inicial
para el signo de Number. Si Number es positivo, la cadena devuelta contiene un
espacio inicial; y el signo ms se da por supuesto. Un nmero negativo incluir el signo
menos (-) y ningn espacio inicial.

Dim MyString As String


MyString = Str(459)
' Retorna " 459"
MyString = Str(-459.65)
' Retorna "-459.65"
Left (cadena, n)
Extrae los n primeros caracteres de una cadena, comenzando por la izquierda.

Right (cadena, n)
Extrae lo n ltimos caracteres de la cadena

Tcnica de Programacin Orientada a Objetos

284

Para utilizar las dos funciones anteriores que son propias de visual basic emplear
Microsoft.VisualBasic.Funcion

Dim myString As String = "Curso de Visual Net"


Dim subString As String
subString = Microsoft.VisualBasic.Right(myString, 3)
' Retorna "Net"
subString = Microsoft.VisualBasic.Left(myString, 5)
' Retorna "Curso"
Mid (cadena, m, n)
Extrae n caracteres de la cadena, siendo el primer carcter extrado el que ocupa el
lugar m.

Resultado = Mid (cadena, 3, 10)


Retorna rso de Vis

Segundo formato desde una posicin hasta la posicin final

Resultado=Mid(cadena,6)
Retorna de visual net

LCase (cadena)
Devuelve otra cadena igual, pero con todos los caracteres en minsculas. (LCase =
Lower Case)

Resultado = Lcase (cadena)


Retorna curso de visual basic

UCase (cadena)
Devuelve otra cadena igual, pero con todos loscaracteres en maysculas. (UCase =
Upper Case)

Resultado = UCase (cadena)


Retorna CURSO DE VISUAL BASIC

Tcnica de Programacin Orientada a Objetos

285

Len (cadena)
Devuelve la longitud de la cadena

Resultado = Len (cadena)


Retorna 21

Space (n)
Devuelve una cadena formada por n espacios.

Resultado = "A" + Space (6)+ "B"


Retorna A

LTrim
Elimina los posibles espacios que tenga una cadena por su izquierda.

Rtrim
Elimina los posibles espacios que tenga una cadena por su derecha.

Trim
Elimina los espacios que tenga una cadena, tanto por su izquierda como
derecha. (No elimina los espacios centrales de la cadena).

por su

InStr (cadena, cadena1)


Busca la cadena1 dentro de cadena y devuelve el nmero de orden dentro de cadena
donde se encuentra la primera letra de cadena1

Resultado = InStr (cadena, "sua")


Retorna 12

StrConv
Convierte una cadena de caracteres en otra, segn las instrucciones que le sigan.
Puede sustituir a UCase o LCase si la instruccin es UpperCase o LowerCase
respectivamente, o poner la primera letra de todas las palabras de la cadena en
maysculas, si la instruccin es ProperCase.

Resultado = StrConv (cadena, UpperCase)


Retorna CURSO DE VISUAL BASIC
Tcnica de Programacin Orientada a Objetos

286

Resultado = StrConv (cadena, LowerCase)


Retorna curso de visual basic

Resultado = StrConv (cadena, ProperCase)


Retorna Curso De Visual Basic

En este ejemplo se pone un texto todo en minsculas.

Dim sText, sNewText As String


sText = "Hello World"
sNewText = StrConv(sText, VbStrConv.LowerCase)
Debug.WriteLine (sNewText) ' Outputs "hello world".

FUNCIONES CON NUMEROS


Funcion
Abs
Int

Devuelve
Valor absoluto de un numero real
Parte entera de un real

Rnd

Un numero al azr entre 0 y 1

Exp

Exponecial de un numero real es decir e = 2.71828

El objeto Math.
Funciones:
Math.round(n,d)
Redondea, con ciertos numeros de decimals
Math.Round(3.45, 1) 'Retorna 3.4
Math.Round(3.46, 1) 'Retorna 3.5

Math.PI
El valor de este campo es 3,14159265358979323846

Math.acos
Devuelve el ngulo cuyo coseno es el nmero especificado

Tcnica de Programacin Orientada a Objetos

287

Math.ceiling
Devuelve el nmero entero ms pequeo mayor o igual que el nmero especificado.

Math.ceiling(3.1) 'Retorna 4
Math.Floor
Devuelve el nmero entero ms grande menor o igual que el nmero especificado

Math.Floor(3.1) 'Retorna 3
Math.sqrt(n)
Devuelve la raz cuadrada de un nmero especificado.

Math.pow(n)
Devuelve un nmero especificado elevado a la potencia especificada

Tcnica de Programacin Orientada a Objetos

288

Aplicaciones

1- Aplicacin 1: Usando Funciones de Cadena

Private Sub BTNSPLIT_Click(..)


Dim CAD As String
Dim VEC() As String
Dim I As Integer
CAD = TXTCAD.Text.Trim
ListBox1.Items.Clear()
VEC = CAD.Split(" ".ToCharArray)
For I = 0 To UBound(VEC)
ListBox1.Items.Add(VEC(I))
Next
End Sub

Private Sub FRMCADENA_Activated(..)


TXTCAD.Text = "esto es una prueba"
End Sub

Tcnica de Programacin Orientada a Objetos

289

Private Sub HandleCheckedChanged(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles rbn1.CheckedChanged, rbn2.CheckedChanged,
rbn3.CheckedChanged, rbn4.CheckedChanged, rbn5.CheckedChanged,
rbn6.CheckedChanged, rbn7.CheckedChanged
DisplayText(CType(sender, RadioButton))
End Sub
Private Sub DisplayText(ByVal rbtn As RadioButton)
Dim cadr, texto As String
texto = TXTCAD.Text.Trim
If rbtn Is rbn1 Then
cadr = texto.Insert(3, " ojo")
ElseIf rbtn Is rbn2 Then
cadr = texto.Replace("prueba", "practica")
ElseIf rbtn Is rbn3 Then
'extraer apartir de la izquierda
cadr = texto.Substring(0, 3)
ElseIf rbtn Is rbn4 Then
'borrar los carect. desde la posicion 3 cinco caracteres
cadr = texto.Remove(3, 5)
ElseIf rbtn Is rbn5 Then
'extraer apartir de la derecha
cadr = texto.Substring(texto.Length - 3, 3)

ElseIf rbtn Is rbn6 Then


' extraer apartir de una posicion
cadr = texto.Substring(4, 5)
ElseIf rbtn Is rbn7 Then
' extraer apartir de una posicion
cadr = "posicion " & texto.IndexOf("t").ToString

End If
lblres.Text = cadr
End Sub

Tcnica de Programacin Orientada a Objetos

290

2- Aplicacin 2: Empleando el Split


Mostrando el formulario principal

En el Formulario 3.
Private Sub Button1_Click(..)
Dim x As New Form1()
x.ShowDialog()
End Sub

Private Sub Button2_Click(..)


Dim x As New Form2()
x.ShowDialog()
End Sub

Tcnica de Programacin Orientada a Objetos

291

En el Formulario 1.
Private Sub btnSplit_Click(..)
Dim TempArray() As String
Dim CurIndex As Integer
lstOutput.Items.Clear()
If txtInput.Text.Length > 0 And

txtSeparator.Text.Length > 0 Then

TempArray = txtInput.Text.Split(txtSeparator.Text)

For CurIndex = 0 To TempArray.GetUpperBound(0)


lstOutput.Items.Add(TempArray(CurIndex))
Next

End If
End Sub

Tcnica de Programacin Orientada a Objetos

292

En el Formulario 2.
Private Sub btnJoin_Click(..)
Dim TempArray() As String
Dim RandomInteger As New System.Random()
Dim CurIndex As Integer
Dim NumElements As Integer = Convert.ToInt32(txtArraySize.Text)

'Generate random numbers, put in TempArray


If NumElements > 0 Then
ReDim TempArray(NumElements)
For CurIndex = 0 To NumElements - 1
TempArray(CurIndex) = RandomInteger.Next(1000).ToString
Next
End If

'Join array elements into a comma-separated string


txtOutput.Text = String.Join(",", TempArray)

End Sub

Tcnica de Programacin Orientada a Objetos

293

3- Aplicacin 3: Conversin de un numero al sistema binario y hexadecimal

Private Sub

CmdBin_Click(.)

Dim cad as String


Dim

N, r as String

n = Val(TxtNum.text)
cad = ""
Do While n <> 0
r = n Mod 2
n = n \ 2
cad = cad + Str(r)
Loop
LBR1 = StrReverse(cad)
End Sub

Private Sub Cmdhexa_Click(.)


Dim cad

As String

, N, R as integer

Dim n%
n = Val(Text1)
cad = ""
Do While n <> 0

Hacer mientras n sea diferente a cero

r = n Mod 16
n = n \ 16
If r > 9 Then
cad = cad + Chr(55 + r)
Else
cad = cad + Str(r)
End If
Loop
Lbr2 = StrReverse(cad)
End Sub

Tcnica de Programacin Orientada a Objetos

294

4- Aplicacin 4: Ingresando una frase por teclado invertir las palabras en su


misma posicin, luego visualizar la misma frase como una pirmide cuyo
vrtice es el centro de la frase.
Private Sub CmdInvertir_Click( ..)
Dim PA, P, K, M
Dim

as Integer

Cad, palabra, scad

as String

cad = Trim(Text1.text)
scad = ""

la Frase ingresada

PA = 1

Cadena Vacia Para Formar la frase invertida


es la posicin inicial de la palabra

For M = 1 To Len(cad)
Se pregunta si el caracter es un espacio blanco o M es la ultima posicion
If Mid(cad, M, 1) = " "
If

Then

M = Len(cad) Then P =M

PALABRA = ""

Else P = M - 1

para formar la palabra invertida

For k = PA To P
PALABRA = Mid(cad, k, 1) + PALABRA
Next
scad = scad + " " + PALABRA
End If
PA = P + 1
Next
Text2.text

= scad

Muestra cada palabra de forma invertida

End Sub

Tcnica de Programacin Orientada a Objetos

295

Private Sub CmdPiramide_Click()


List1.Items.Clear
cad = Trim(Text1.text)

Almacena el valor de la Frase

List1.Width = Len(cad) * 100


centenas

El ancho queda definido por la frase en

P = Len(cad) \ 2 + 1

Obtiene la posicin media de la frase

PL = Len(cad): a = 1: con = 1
CR = 1
CI = 1

Separamos en dos mitades la parte derecha un contador

CR

Un contador para la parte Izquierda

cad3 = Space(P) & Mid(cad, P, 1)


espacios

Coloca en el Vertice la Primera letra con

List1.AddItem cad3
For I = 1 To P

If P - CI < 1 Then Exit For

si es un valor menor a uno sale del for

cad1 = Space(P - CI) & Mid(cad, P - CI, CI)


cad2 = Mid(cad, P + 1, cr)
cad4 = cad1 & Trim(cad3) & cad2
List1.AddItem cad4

Cadena de la Izquierda
Cadena de La derecha
Unimos las tres Cadenas
Lo Colocamos en la lista

CI = CI + 1
cr = cr + 1
Next
End Sub

Tcnica de Programacin Orientada a Objetos

296

Funciones con fechas.


Las fechas son cadenas especiales. Visual Basic sabe obtener y tratar la informacin relativa a
la fecha y la hora. Dispone para ello de una declaracin de variable: Date. Una variable
declarada como date puede contener una fecha, una fecha y una hora o una hora solamente.

Dim MyDate As Date


Dim MyMonth As Integer
MyDate = #2/12/1969# ' Assign a date.
MyMonth = Month(MyDate) ' MyMonth contains 2.
Now
Devuelve la fecha y hora actual.

WeekDay
Devuelve el da de la semana (En nmero, 1=Domingo, 2=Lunes,...)

Dim MyDate As Date


Dim MyWeekDay As Integer
MyDate = #2/12/1969# ' asigna una fecha
MyWeekDay = Weekday(MyDate) ' MyWeekDay contains 4
Day
Obtiene el da, a partir de una fecha
Dim MyDate As Date
Dim MyDay As Integer
MyDate = #2/12/1969# .
MyDay = Microsoft.VisualBasic.Day(MyDate) ' MyDay contains 12.

Month
Obtiene el mes a partir de una fecha.

MyMonth = Month(MyDate) ' MyMonth contains 2.

Year
Obtiene el ao a partir de una fecha.
MyYear = Year(MyDate) ' MyYear contains 1969.

Tcnica de Programacin Orientada a Objetos

297

Hour
Obtiene la hora a partir de una hora

Minute
Obtiene el minuto a partir de una hora.

Second
Obtiene el segundo a partir de una hora.

DateAdd
Aade un intervalo de tiempo a una fecha

Interval
Requerido. Valor de enumeracin DateInterval o expresin String que representa el
intervalo de tiempo que se desea agregar.
Number
Requerido. Double. Expresin de punto flotante que representa el nmero de
intervalos que se desea agregar. Number puede ser un valor positivo (para obtener
fechas u horas futuras) o negativo (para obtener fechas u horas pasadas). Puede
contener una parte decimal cuando Interval especifica horas, minutos o segundos.
Para otros valores de Interval, se omite cualquier parte decimal de Number.
DateValue
Requerido. Date. Expresin que representa la fecha y la hora a la que debe agregarse
el intervalo. El propio DateValue no se modifica en el programa que realiza la llamada.
Valores

El argumento Interval puede tener uno de los siguientes valores:


Valor de enumeracin

Cadena

Unidad de intervalo de tiempo agregada

DateInterval.Day

Da; truncado al valor integral

DateInterval.DayOfYear

Da; truncado al valor integral

DateInterval.Hour

Hora; redondeada al milisegundo ms cercano

Tcnica de Programacin Orientada a Objetos

298

DateInterval.Minute

Minuto; redondeado al milisegundo ms cercano

DateInterval.Month

Mes; truncado al valor integral

DateInterval.Quarter

Trimestre; truncado al valor integral

DateInterval.Second

Segundo; redondeado al milisegundo ms cercano

DateInterval.Weekday

Da; truncado al valor integral

DateInterval.WeekOfYear

ww

Semana; truncada al valor integral

DateInterval.Year

yyyy

Ao; truncado al valor integral

Dim NextTime As Date = Now

' Current date and time.

NextTime = NextTime.AddDays(3.4) ' Increment by 3 2/5 days.

En este ejemplo se toma una fecha y mediante la funcin DateAdd, se muestra


la fecha correspondiente un nmero especificado de meses en el futuro.
Dim Msg, Number, StartDate As String 'Declare variables.
Dim Months As Double
Dim SecondDate As Date
Dim IntervalType As DateInterval
IntervalType = DateInterval.Month ' Especifica intervalos en meses.
StartDate = InputBox("Ingrese fecha ")
SecondDate = CDate(StartDate)
Number = InputBox("Ingrsa el numero de meses a adicionar")
Months = Val(Number)
Msg = "New date: " & DateAdd(IntervalType, Months, SecondDate)
MsgBox (Msg)

Tcnica de Programacin Orientada a Objetos

299

DateDiff
Obtiene el intervalo de tiempo entre dos fechas
DateDiff(intervalo, fecha1, fecha2[, primerdasemana[, primerasemanaao]])
Intervalo

Descripcin

yyyy

Ao

Trimestre

Mes

Da del ao

Da

Da de la semana

Ww

Semana

Hora

Minuto

Segundo

Este ejemplo utiliza la funcin DateDiff para mostrar el nmero de das entre una
fecha dada y hoy.
Dim DatTim1 As Date = #1/4/2004#

' primera fecha.

Dim DatTim2 As Date = #1/9/2004#

' segunda fecha.

Dim dias As Long = DateDiff("d", DatTim1, DatTim2)


Dim meses As Long = DateDiff("m", DatTim1, DatTim2)
MsgBox(dias)

devuelve 5

Msgbox(meses)

devuelve 0

Tcnica de Programacin Orientada a Objetos

300

DatePart
Devuelve una parte de una fecha (semana, trimestre, etc.)

El argumento Interval puede tener uno de los siguientes valores:


Valor de enumeracin

Cadena

Parte del valor de fecha u hora devuelta

DateInterval.Day

Da del mes (del 1 al 31)

DateInterval.DayOfYear

Da del ao (del 1 al 366)

DateInterval.Hour

Hora

DateInterval.Minute

Minuto

DateInterval.Month

Mes

DateInterval.Quarter

Trimestre

DateInterval.Second

Segundo

DateInterval.Weekday

Da de la semana (del 1 al 7)

DateInterval.WeekOfYear

Ww Semana del ao (de la 1 a la 53)

DateInterval.Year

yyyy Ao

Este ejemplo obtiene una fecha y, utilizando la funcin DatePart, muestra el trimestre
del ao que ocurre.
Dim FirstDate, Msg As String 'Declare variables.
Dim SecondDate As Date
FirstDate = InputBox("Enter a date:")
SecondDate = CDate(FirstDate)
Msg = "Quarter: " & DatePart(DateInterval.Quarter, SecondDate)
MsgBox (Msg)

Tcnica de Programacin Orientada a Objetos

301

Datetime.
Representa un instante de tiempo, normalmente expresado en forma de fecha y hora
del da. (es propio del framework)

Dim objdate as datetime


Objdate.Metodo.- Lista de metodos
Objdate.day dia del mes
Similares a las funciones anteriores ,DayOfweek (dia de la
semana),Month,Now,Hour,Minute,seconds, etc

Funcin FORMAT
Esta funcin permite presentar cadenas de numricas o fechas de una determinada forma.
Permite establecer el Formato de esa cadena.

FechadeHoy = Format (Now, yyyy-mm-dd)

La variable FechadeHoy tendr el valor 1998-05-21, que se refiere al da 21 de mayo


de 1998, segn el formato recomendado por la norma ISO-8601 para la presentacin
de fechas. Si hubisemos puesto la expresin FechadeHoy = Format (Now,
dd/mm/yy) , la variable FechadeHoy contendra el valor 21/05/98 referido al da
citado.

firstdayofweek. Especifica el primer da de la semana. Puede tomar uno de


estos valores o constantes :
Constante
VbSunday
vbMonday
vbTuesday
vbWednesday
vbThursday
vbFriday
vbSaturday

Valor
1
2
3
4
5
6
7

Tcnica de Programacin Orientada a Objetos

Descripcion
Domingo (valor por defecto)
Lunes
Martes
Miercoles
Jueves
Viernes
Sabado

302

Observe que usamos la expresin Variable =Format (1234567,Formato) para todos


los ejemplos de nmeros.

Para poner los nmeros separados por millares :

Variable = Format(1234567, "##,###,###") Variable = 1.234.567

Ejemplos de funciones fecha:

Ingresando una fecha mostrar la edad exacta de cualquier presenta.

Public Class Form1


Private Sub BTnCalculo_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnCalculo.Click
Dim FE, FA, FN As Date
FA = Today : FE = CDate(TXTFE.Text)
Dim DIAS, MES, AA, DA, DN As Integer
AA = Year(FA) - Year(FE)
FN = CDate(FE.Day & "/" & FE.Month & "/" & FA.Year)
DA = FA.DayOfYear : DN = FN.DayOfYear
If DN > DA Then AA = AA - 1
FE = FE.AddYears(AA)
MES = DateDiff("M", FE, FA)

Tcnica de Programacin Orientada a Objetos

303

FE = FE.AddMonths(MES)
If DN > DA Then
DIAS = DateDiff("D", FA, FE)
Else
DIAS = DateDiff("D", FE, FA)
End If
LBFE.Text = AA
LBDIA.Text = DIAS
LBMES.Text = MES
End Sub

End Class

Tcnica de Programacin Orientada a Objetos

304

Aplicaciones empleando funciones Fechas


1.- Realizar un programa que permita generar los cdigos de los empleados que sern
almacenados en una lista, el cdigo se genera en funcin del cargo y ao de ingreso
Segn: el cdigo esta compuesto de seis Caracteres.
Apellidos = Laura Lee
Cargo = Docente

fecha = 20/02/2001

Su cdigo ser : D01001

Consideracin: el Campo apellido y nombre solo debe aceptar letras y espacios en Blanco,
La fecha debe ser correcta.

Tcnica de Programacin Orientada a Objetos

305

2.- Aplicando Fechas.- Ingrese como datos Monto de la cuota, fecha de vencimiento y
fecha de pago , calcular los das de mora , pago por mora y el pago total
Los pago por Mora es de acuerdo a:

Menor a una semana

1% por cada dia

Entre 2 y 3 semanas

1.5% por dia

Mayor a 3 semanas

2% por dia

3.- Ingrese por teclado cierta cantidad de Bolas de billar , con el cual se desea formar una
pirmide de base cuadrada, cada superficie esta formado por un numero cuadrado perfecto,
calcular el numero de superficies que se forman y el numero de bolas que
sobran
Ejemplo para 20 Bolas sern 3 superficies y sobran 6 bolas.

4.- Alquiler de Maquinas

Tcnica de Programacin Orientada a Objetos

306

El pago hora es de acuerdo al usuario:


Estudiante S/. 1.50

Publico S/2.00

Docente

S/1.0

4.- Realice una aplicacin en donde se ingrese a cuadros de texto el Da(entre 1 y 31),
Mes(entre 1 y 12) y Ao de Nacimiento(4 dgitos) de una persona, luego al pulsar un
clic sobre el botn Calcular mostrar su Edad y el signo Zodiacal (control Image) al
que pertenece.
NOTA: Validar que en los cuadros de texto slo se debe ingresar dgitos.

Tcnica de Programacin Orientada a Objetos

307

Contenido.

Programacin Orientada a Objetos en .NET


o Entendiendo el modelo POO: Herencia, Polimorfismo, Encapsulamiento
o Clases y Estructuras
o Interfaces
o Constructores y Destructores
o Sobrecarga
o Miembros de las Clases: Campos, Propiedades y Mtodos. mbitos:
Public, Private, Protected, Friend, Protected Friend.

Recursividad.

Programacin Orientada a Objetos en .NET


Visual Basic .NET tiene todas las caractersticas de la Programacin Orientada a Objetos
(POO), ya que el Marco .NET soporta los requerimientos para que todos los lenguajes que
trabajen con l usen POO. Estas caractersticas son:

1. Encapsulacin
Cuando creamos un componente .NET este se encuentra encapsulado, ya que oculta la
lgica de programacin a los usuarios que lo utilizan, permitiendo manejar dicho objeto a
travs de sus miembros, tales como propiedades y mtodos, realizando el desarrollo de
aplicaciones ms simple, al ocultar la complejidad del cdigo (encapsular).

2. Herencia
La herencia es la caracterstica en la cual una clase llamada Clase Base pasa o hereda
todas sus caractersticas a otra llamada Clase Derivada, permitiendo la total reusabilidad
del cdigo escrito en las aplicaciones. La herencia de clases es una nueva caracterstica de
Visual Basic .NET y no solo es a nivel de clases creadas en ste lenguaje sino a travs de
cualquier lenguaje del Marco .NET.

Tcnica de Programacin Orientada a Objetos

308

3. Polimorfismo
Otra caracterstica interesante de la POO es el polimorfismo, en el caso de Visual Basic
.NET ste se puede crear cuando en una clase derivada se implementa de manera distinta
un mtodo heredado de la clase base. Es decir, podemos tener un mismo mtodo con dos
comportamientos distintos (cdigos distintos) de acuerdo al tipo de objeto, que puede ser
creado de la clase base o de la derivada.

Como vemos las nuevas caractersticas de la Programacin Orientacin a Objetos (POO)


mezcladas con la facilidad de uso de la Programacin Orientada a Componentes (POC) dan
como resultado la creacin de aplicaciones poderosas y con un bajo costo de mantenimiento.

Sin duda, la reusabilidad y encapsulacin ofrecida por la tecnologa COM basada en


componentes se ve incrementada por la herencia de clases y el polimorfismo ofrecida por la
tecnologa .NET orientada a objetos; logrndose una verdadera integracin entre aplicaciones.

Para finalizar esta introduccin a los componentes .NET, la otra gran ventaja con respecto a
COM es la distribucin de componentes, que en este ltimo era una pesadilla debido haba que
registrar componentes y lidiar con los problemas de compatibilidad de versiones; en cambio
con .NET los componentes no se registran y su distribucin es automtica con solo copiar y
pegar la aplicacin.

Elementos de una Clase (Miembros)


Todos los componentes estn formados por clases y estas a su vez se componen de
elementos o miembros, los cuales trataremos en este captulo. Para ilustrar mejor tenemos el
siguiente grfico.

Estructura de un Componente .NET


Clase Base

Clase Derivada

Constantes

Constantes

Enumeraciones

Enumeraciones

Campos

Campos

Propiedades

Propiedades

Mtodos

Mtodos

Eventos

Eventos

Delegados

Delegados

Tcnica de Programacin
Orientada a Objetos
Constructores
Destructores

Constructores
Destructores

309

A diferencia de Visual Basic 6 en donde las clases podan tener solo propiedades, mtodos,
eventos y constantes enumeradas; en Visual Basic .NET las clases pueden tener campos,
delegados, constructores y destructores. Adems pueda ser que una clase herede de otra que
este dentro del componente o en otro componente .NET.

Clase
Una clase es la plantilla para crear el objeto, es aqu donde se definen las partes del objeto:
datos (propiedades, constantes, enumeraciones, campos) y procedimientos que operan sobre
los datos (mtodos).

La clase define un nuevo tipo de datos que resulta de la abstraccin de algn elemento en la
aplicacin, por tanto, es necesario disear bien la aplicacin antes de crear la clase, ya que
esta solo implementa el diseo de objetos previamente realizado.

Declaracin de una Clase


A diferencia de Visual Basic 6, donde el tipo de clase estaba dado por la propiedad Instancing
de la clase, que poda ser privada (Private), dependiente (PublicNotCreateTable) o pblica
(SingleUse, GlabalSingleUse, MultiUse, o GlobalMultiUse); en VB .NET no existe propiedades
para el mdulo de clase, ya que las caractersticas de la clase dependen de la forma de su
declaracin.

Sintaxis:

[Tipo de Declaracin] Class <Nombre Clase>


<Definicin de miembros de la clase>
<...>
End Class

Tcnica de Programacin Orientada a Objetos

310

Existen varias formas de declarar una clase, que detallamos a continuacin en la siguiente
tabla:

Declaracin

Alcance o mbito

Public

Puede usarse en cualquier otra clase del componente o en las


aplicaciones clientes.

Private

No puede usarse en otras clases del componente ni en las


aplicaciones clientes.

Protected

Solo puede ser usada por las clases derivadas de ste, pero no por las
aplicaciones clientes.

Friend

Solo puede ser usada por las otras clases del componente, pero no por
las aplicaciones clientes.

Protected Friend

Es una combinacin de ambas, es decir, la clase puede ser usada por


otras clases del componente y por las clases derivadas.

Shadows

Indica que los miembros de la clase pueden ocultarse en la clase


derivada, es decir que al heredar se ocultan ciertos miembros.

MustInherit

Determina que los miembros de la clase pueden heredarse a una clase


derivada, pero no puede ser creada por aplicaciones clientes

NotInheritable

La clase no puede heredarse pero si instanciarse desde aplicaciones


clientes.

Tcnica de Programacin Orientada a Objetos

311

Ejemplo:
Si queremos crear una aplicacin de Planilla necesitamos disear un componente que
manipule informacin del empleado, sus horas trabajadas, tardanzas, faltas, etc.

Para crear la clase Empleado, de tal manera que pueda heredarse y utilizarse tanto dentro del
componente como en las aplicaciones clientes, definiramos la clase en Visual Basic, tal como
sigue:

Public Class Empleado

End Class

Repaso: Constantes, Campos y Enumeraciones


Constantes

Una constante es un dato que permanece fijo en toda la ejecucin de la aplicacin, a diferencia
de la variable, cuyo valor va cambindose en tiempo de ejecucin.

Se utiliza para facilitar el mantenimiento del cdigo, ya que si definimos un valor en una
constante, si este cambia, con solo cambiar el valor de la constante, la aplicacin trabajara con
el nuevo valor.

Sintaxis:
[Public | Private] Const <Nombre> [As <Tipo Dato>]=<Valor>

Ejemplo:
Podemos crear un par de constantes que almacenen el valor de las tasas de los impuestos a la
renta e impuesto extraordinario de solidaridad, para propsitos del clculo de descuentos.

Private Const TasaIRenta As Single = 0.1


Private Const TasaIES As Single = 0.02

Tcnica de Programacin Orientada a Objetos

312

Nota:
En Visual Basic .NET si no se define el tipo de dato de la constante se asume que es Object,
ya no Variant como en Visual Basic 6, debido a que ste tipo de dato ya no existe.

Campos

Un campo es una variable local para la clase, es decir, solo puede ser usada internamente por
los miembros de la clase pero no por otras clases o por aplicaciones clientes.

El campo solo puede ser una variable privada o protegida que se use dentro de la clase para
almacenar un valor usado por alguna propiedad o mtodo, sin que ste pueda ser visto o
instanciado por otras aplicaciones.

Sintaxis:
[Private | Friend] <Nombre Campo> [As <Tipo Dato>]

Ejemplo:
Podemos crear un par de campos que almacenen el clculo de los impuestos a la renta e
impuesto extraordinario de solidaridad, para el total de descuentos.

Private IES As Single


Private IRenta As Single

Enumeraciones

Una enumeracin es una estructura de datos personalizada que define un conjunto de valores
enteros. Por defecto, el primer dato enumerado empieza en 0, el segundo en 1 y as
sucesivamente, aunque esto puede cambiarse al momento de definir la enumeracin.

Las enumeraciones son tiles para dar claridad al programa y evitar errores de asignacin de
variables, ya que si definimos una variable de tipo enumerada, el valor que se puede asignar
est limitado por el rango de valores definido en la enumeracin.

Tcnica de Programacin Orientada a Objetos

313

Sintaxis:
[Public | Private | Protected | Friend] Enum <Nombre Enumeracin>
<Elemento1>[=<Valor1>]
<Elemento2>[=<Valor2>]
<Elemento3>[=<Valor3>]
<...>
End Enum

Ejemplo:
Vamos a crear dos enumeraciones, la primera que describa los cargos de los empleados que
se usar desde otras clases y aplicaciones, y la segunda que defina las reas de la empresa
para propsitos internos de trabajar con informacin del empleado.

Public Enum Cargos


Auxiliar
Tcnico
Ingeniero
Secretaria
Vendedor

End Enum

Private Enum Areas


Gerencia = 100
Contabilidad = 200
Produccin = 300
Sistemas = 400
Ventas = 500

End Enum

Tcnica de Programacin Orientada a Objetos

314

Para usar estas enumeraciones creadas, tan solo basta declarar una variable de estos tipos y
asignarle un valor definido, por ejemplo, para el caso anterior sera como sigue:

Dim Cargo As Cargos


Cargo = Cargos.Vendedor
Dim Area As Areas
Area = Areas.Ventas

Propiedades

Una propiedad es una caracterstica del objeto que tiene informacin sobre un cierto atributo de
ste como por ejemplo su nombre, descripcin, etc. Las propiedades son mtodos que se
trabajan como si fuesen campos, con la diferencia que el campo es interno solo para uso de la
clase, en cambio las propiedades se usan fuera de la clase.

A diferencia de la versin anterior de Visual Basic que existan 3 estructuras para declarar una
propiedad (Property Get, Let, y Set), ahora, en Visual Basic .NET solo existe una estructura
llamada Property donde internamente se define si la propiedad es de lectura (Get) y/o escritura
(Set), tal como se muestra debajo.

Sintaxis:
[Tipo de Declaracin] Property <Nombre > [As <Tipo Dato>]
[[ReadOnly] Get
<Instrucciones>
End Get]
[[WriteOnly] Set (ByVal Value [As <Tipo Dato>])
<Instrucciones>
End Set]
End Property

Tcnica de Programacin Orientada a Objetos

315

Existen muchas formas de declarar una propiedad, que explicamos en la sgte tabla:

Declaracin

Uso

Default

Indica que la propiedad es por defecto (no es necesario escribirla)

Public

Puede ser usada desde cualquier clase o aplicacin.

Private

Solo puede ser accesada desde dentro de la clase.

Protected

Se usa desde dentro de la clase o desde una clase derivada.

Friend

Puede ser usada desde otras clases del componente pero no fuera.

Protected Friend

Tiene las caractersticas de la protegida y amiga, es decir, se usa


dentro de la clase, desde una clase derivada o desde otra clase del
mismo componente, pero no en aplicaciones clientes.

ReadOnly

Indica que el valor de la propiedad solo puede ser recuperado pero no


escrito. Solo puede tener la clusula Get y no Set.

WriteOnly

Indica que el valor de la propiedad solo puede ser escrito pero no


devuelto. Solo puede tener la clusula Set y no Get.

Overloads

Permite que la propiedad de la clase base sea sobrecargada, es decir


definida varias veces en las clases derivadas pero con diferentes
parmetros que la propiedad definida en la clase base.

Overrides

Permite sobrescribir la propiedad por otra propiedad con el mismo


nombre en una clase derivada.

Overridable

Permite sobrescribir la propiedad por un mtodo con el mismo nombre


en una clase derivada.

Tcnica de Programacin Orientada a Objetos

316

NotOverridable

Indica que la propiedad no puede ser sobrescrita por nadie en ninguna


clase derivada.

MustOverride

Indica que la propiedad no puede ser implementada en esta clase y


puede ser implementada en una clase derivada.

Shadows

Se usa para ocultar una propiedad de tal manera que no pueda


implementarse en una clase derivada.

Shared

Permite que la propiedad sea compartida y pueda llamarse sin


necesidad de instanciar a la clase sino a travs de su nombre.

Ejemplo:
Para nuestra clase Empleado, podemos implementar las propiedades cdigo, nombre y bsico
del empleado, de tal manera que se puedan leer y escribir en cualquier parte.

Private mvarCodigo As Integer


Private mvarNombre As String
Private mvarSueldo As Single

Public Property Codigo() As Integer


Get
Codigo = mvarCodigo
End Get
Set(ByVal Value As Integer)
mvarCodigo = Value
End Set

End Property

Public Property Nombre() As String


Tcnica de Programacin Orientada a Objetos

317

Get
Nombre = mvarNombre
End Get
Set(ByVal Value As String)
mvarNombre = Value
End Set

End Property

Public Property Sueldo() As Single


Get
Sueldo = mvarSueldo
End Get
Set(ByVal Value As Single)
mvarSueldo = Value
End Set

End Property

Mtodos
Un mtodo es un conjunto de instrucciones que modifica el estado de las propiedades; en
trminos de objetos, un mtodo es un servicio o funcin del objeto, mientras que en trminos
de cdigo un mtodo es un procedimiento o funcin que realiza una tarea especfica.

En Visual Basic .NET todos los miembros de una clase (propiedades, eventos, constructores,
destructores, etc.) son en realidad mtodos; claro, estos ltimos son mtodos especiales.

Un procedimiento o funcin en una clase es un mtodo, y sus caractersticas son las mismas
que cuando se encuentran en un mdulo estndar, es decir, si es procedimiento la declaracin
es con Sub, y si es funcin la declaracin es con Function, tal como se muestra en la sintaxis
de abajo.

Tcnica de Programacin Orientada a Objetos

318

Sintaxis:
[Tipo Declaracin] [Sub | Function] <Nombre >([Param]) [As <Tipo Dato>]
<Instrucciones>
[Exit [Sub | Function]]
End Property

En cuanto al tipo de declaracin, es muy similar al de las propiedades, que describimos


anteriormente en una tabla, es decir, puede declararse el mtodo como Public, Private,
Protected, Friend, Protected Friend y Shadows.

Tambin hay que recordar que si el mtodo es una funcin siempre se deber devolver un
valor, que se puede hacer de dos formas: de manera clsica asignando un valor al nombre de
la funcin o de una nueva forma escribiendo la sentencia return y el valor.

Ejemplo:
En nuestro ejemplo de Empleado, podemos implementar dos mtodos pblicos, uno que
permita asignar valores a las propiedades creadas: cdigo, nombre y sueldo del empleado y
otro mtodo que permita actualizar el sueldo.

Public Sub CrearEmpleado(ByVal vCodigo As Integer, _


ByVal vNombre As String, ByVal vSueldo As Single)
mvarCodigo = vCodigo
mvarNombre = vNombre
mvarSueldo = vSueldo

End Sub

Public Sub ActualizarSueldo(ByVal vNuevoSueldo As Single)


mvarSueldo = vNuevoSueldo

End Sub

Tcnica de Programacin Orientada a Objetos

319

Eventos
Un evento es un suceso que le ocurre al objeto y que le indica o notifica sobre un cambio en
sus atributos o propiedades. Un evento es necesario para controlar el estado de las
propiedades e informar a las aplicaciones del nuevo estado, para que estas realicen la accin
correspondiente.

Es fcil entender eventos asociados a objetos visuales como los controles, por ejemplo en el
objeto Button se tiene el evento Click que se desencadena al seleccionar el botn, el evento
MouseMove que ocurre al pasar el mouse por el botn, y as hay muchos eventos asociados
al objeto botn; pero, cuando trabajamos con clases, los eventos son ms abstractos y un poco
ms difciles de entender, ya que poda confundirse con los mtodos.

Para aclarar el concepto de eventos definamos mentalmente una clase llamada Cuenta para
un componente llamado Banco. Esta clase cuenta tiene propiedades como NumeroCta,
FechaApertura, TipoCta, NumeroTarjeta y Saldo. Adems tiene mtodos como
Depsito, Retiro y Transferencia que modifican el estado del saldo. Cuando hacemos un
Retiro de nuestra cuenta donde el monto a retirar supera al Saldo se desencadena un
evento llamado SaldoInsuficiente y tambin cuando durante el da hemos retirado ms del
monto permitido se desencadena el evento LimiteRetiroDiario.

Para crear un evento en la clase primero declare l evento con la sentencia Event y luego
llmelo con RaiseEvent, tal como se muestra en la sintaxis.

Declaracin Sintaxis:
[Tipo Declaracin] Event <Nombre > ([Parmetro(s)])
Declaracin Llamada:
RaiseEvent <Nombre > ([Parmetro(s)])

El tipo de declaracin, es igual que la de los mtodos, es decir, puede ser Public, Private,
Protected, Friend, Protected Friend y Shadows.

Tcnica de Programacin Orientada a Objetos

320

Ejemplo:
Crear dos eventos que nos informen cuando el sueldo es bajo o alto; para nuestra realidad un
sueldo ser bajo cuando es menor a 500 y alto cuando sea mayor a 3000.

Public Event SueldoBajo()


Public Event SueldoAlto()

Private Sub ChequearSueldo()


If mvarSueldo < 500 Then
RaiseEvent SueldoBajo()
ElseIf mvarSueldo > 3000 Then
RaiseEvent SueldoAlto()
End If
End Sub

Para finalizar, deberamos llamar a la rutina ChequearSueldo al final de CrearEmpleado y


ActualizarSueldo que es donde se modifica el Sueldo.

Tcnica de Programacin Orientada a Objetos

321

Constructores y Destructores
Constructores
Un constructor es un mtodo que se usa para inicializar caractersticas del objeto. Todas las
clases de Visual Basic .NET tienen un constructor por defecto que es el mtodo New, pero se
pueden agregar varios constructores New diferencindose por el nmero de parmetros.

Sintaxis:
Public Sub New ()
<Instrucciones>
End Sub
Public Sub New ([<Param1> As <Tipo Dato>])
<Instrucciones>
End Sub
Public Sub New ([<Param1> As <Tipo Dato>,<Param2> As <Tipo Dato>])
<Instrucciones>
End Sub
Public Sub New ([<P1> As <Dato>,<P2> As <Dato>,,<PN> As <Dato>])
<Instrucciones>
End Sub

Nota:
Es requisito indispensable escribir los mtodos constructores al inicio de la clase, de lo
contrario no funcionaran.

Tcnica de Programacin Orientada a Objetos

322

Ejemplo:
Continuando con nuestro ejemplo de la clase Empleado podemos crear 4 constructores que
permitan crear de cuatro maneras distintas un objeto de tipo empleado.

Public Sub New()


End Sub

Public Sub New(ByVal vCodigo As Integer)


mvarCodigo = vCodigo
End Sub

Public Sub New(ByVal vCodigo As Integer, ByVal vNombre As String)


mvarCodigo = vCodigo
mvarNombre = vNombre
End Sub

Public Sub New(ByVal vCodigo As Integer, ByVal vNombre As String,


ByVal vSueldo As Single)
mvarCodigo = vCodigo
mvarNombre = vNombre
mvarSueldo = vSueldo
End Sub

Tcnica de Programacin Orientada a Objetos

323

Destructores
Un destructor es un mtodo que se usa para limpiar caractersticas del objeto antes que sea
destruido y liberado de la memoria. Por ejemplo, si tenemos una clase que accede a datos y
que abre una conexin hacia una base de datos para crear un Dataset, entonces recitamos un
destructor que permita cerrar el Dataset y la conexin antes de destruir el objeto que apunta a
dicha clase.

El FrameWork .NET solo provee de destructores a Visual C#, en cambio, en Visual Basic :NET
no existe un mtodo especial para crear destructores; en vez de ello se crea un mtodo
cualquiera que realice la labor de iniciar variables, liberar recursos, etc.

Sintaxis:
Public Sub <Nombre Destructor>()
<Instrucciones>
End Sub

Ejemplo:
Para la clase Empleado podemos crear un destructor llamado Finalizar que permita liberar
las variables usadas por las propiedades para almacenar sus valores.

Public Sub Finalizar()


mvarCodigo = Nothing
mvarNombre = Nothing
mvarSueldo = Nothing

End Sub

Tcnica de Programacin Orientada a Objetos

324

Creando una Librera de Clases


Despus de ver los elementos de una clase, es momento de crear Componentes .NET los
cuales tambin son conocidos como Librera de Clases, para lo cual existen varias etapas
que detallamos a continuacin.

Eligiendo el Tipo de Aplicacin

Del men File, elegir New y luego Project o pulsar [Ctrl + N]


En la opcin Project Types elegir Visual Basic Projects y en la opcin Templates
elegir Class Library

Seleccionar la ubicacin y escribir un nombre adecuado para el proyecto,


generalmente, se acostumbra colocar el nombre de la Empresa, nosotros podemos
llamar al componente ACME y luego OK.
Inmediatamente aparecer una clase llamada Class1, proceder a cambiar de nombre
fsico y lgico, por ejemplo ponerle como nombre Empleado.

Tcnica de Programacin Orientada a Objetos

325

Aadiendo una Clase


Por defecto toda librera trae una clase, pero si queremos crear mas clase realizamos lo
siguiente:

Del men Project elegimos la opcin Add Class

Escribimos el nombre fsico de la clase, este a su vez ser por defecto el nombre lgico y
damos clic en Open.

1. Por defecto aparecer la siguiente estructura:

Public Class Cliente

End Class

Tcnica de Programacin Orientada a Objetos

326

2. Dependiendo del alcance que queramos que tenga el objeto se puede modificar el tipo de
declaracin Public a una de las vistas anteriormente, tales como: Private, Protected,
Friend, Shadows, etc.

Creando Propiedades, Mtodos, Eventos


La creacin de propiedades, mtodos y eventos se realiza dentro del mdulo de clase tal como
se mostr anteriormente. Por ejemplo para la clase Empleado podemos crear lo siguiente.

1. Aadiendo una propiedad:

Private mvarSueldo As Single

Public Property Sueldo() As Single


Get
Sueldo = mvarSueldo
End Get
Set(ByVal Value As Single)
mvarSueldo = Value
End Set

End Property

2. Aadiendo un mtodo:

Public Sub ActualizarSueldo(ByVal vNuevoSueldo As Single)


mvarSueldo = vNuevoSueldo

End Sub

3. Aadiendo eventos:

Public Event SueldoBajo()


Public Event SueldoAlto()

4. Llamando eventos:

Tcnica de Programacin Orientada a Objetos

327

Sub ChequearSueldo()
If mvarSueldo < 500 Then
RaiseEvent SueldoBajo()
ElseIf mvarSueldo > 3000 Then
RaiseEvent SueldoAlto()
End If

End Sub

Public Sub ActualizarSueldo(ByVal vNuevoSueldo As Single)


mvarSueldo = vNuevoSueldo
ChequearSueldo()

End Sub

Tambin podemos definir en el mdulo de clase constantes, campos y enumeraciones;


adems, podemos aadir constructores y destructores para la clase, tal como vimos en la
seccin anterior.

Tcnica de Programacin Orientada a Objetos

328

Probando y Usando la Librera de Clases


Probar la Librera de Clases
Para probar el funcionamiento de la Librera de Clases es necesario crear una aplicacin que
use los miembros de las clases de la librera. Esta aplicacin la llamaremos el Cliente del
componente y puede estar escrito en cualquier lenguaje del FrameWork .NET, es decir, si
creamos una librera en Visual Basic .NET, la podemos probar o usar en una aplicacin Visual
Basic .NET, Visual C#, Visual C++, COBOL, Pascal, C++, etc.

Vamos a asumir que se desea crear una aplicacin cliente en Visual Basic .NET que pruebe la
librera de clases creada, para esto necesitamos realizar lo siguiente:

1. Del men File, elegir Add Project, y luego seleccionar New Project. Elegir una plantilla
de aplicacin para Windows o Web en Visual Basic .NET
2. Elegir el directorio donde se crear la aplicacin, escribir el nombre y OK. Aparecer un
nuevo proyecto en la solucin, el cual se ejecuta por defecto.

3. Para indicar que el proyecto de la aplicacin es el que se ejecuta dar clic derecho sobre el
nombre del proyecto en la ventana del Solution Explorer y elegir Set as StartUp Project.

Tcnica de Programacin Orientada a Objetos

329

4. Para usar la librera desde la aplicacin creada hacer una referencia a esta, desde el men
Project eligiendo Add Reference...
5. Elegir la ficha Projects de la ventana de aadir referencia y se mostrar la librera creada
en la misma solucin, tal como se muestra en la figura anterior.
6. Dar clic al botn Select y luego OK; inmediatamente, aparecer en la carpeta
References del proyecto en la ventana del Solution Explorer.

7. Declarar una variable objeto que apunte a una clase del componente o librera, para lo cual
existen 3 formas que ilustraremos con la clase empleado:

1. Primera forma:
Dim objEmpleado As ACME.Empleado
objEmpleado = New ACME.Empleado()

2. Segunda forma:
Dim objEmpleado As ACME.Empleado = New ACME.Empleado()

3. Tercera forma:
Dim objEmpleado As New ACME.Empleado

8. Usar las propiedades y mtodos del objeto, tal como se muestra en el ejemplo:
objEmpleado.CrearEmpleado(123, "Luis Dueas", 1000)

9. Si deseamos usar los eventos, entonces tendremos que declarar la variable en la seccin
de decalaraciones generales, de la siguiente forma:

Private WithEvents objEmpleado As New ACME.Empleado()

10. Para liberar la variable objeto realizar la siguiente asignacin:


objEmpleado = Nothing

Nota:
La anterior sentencia en realidad no destruye la variable, sino que la desactiva, el encargado
de destruir definitivamente al objeto es el Garbage Collector.

Tcnica de Programacin Orientada a Objetos

330

Usar la Librera de Clases


Anteriormente, habamos visto como probar la librera junto con una aplicacin en la misma
solucin, lo que permite realizar depuracin paso a paso, pero cuando ya est probada la
librera no es necesario tener el cdigo fuente, sino tan solo el archivo DLL.
Para usar la librera en cualquier aplicacin solo hay que hacer una referencia y en la opcin
Projects hay que seleccionar el nombre de la DLL que se encuentra en la carpeta del
proyecto. Despus se realizan los mismos pasos que para probarla.

Herencia de Clases
La parte principal de la Programacin Orientada a Objetos (POO) es la herencia de clases, es
decir, la caracterstica de definir una clase que sirva de base para otras clases derivadas, las
clases derivadas tendrn los miembros de la clase base: propiedades, mtodos, eventos, etc.

Los miembros heredados por la clase derivada pueden sobre escribirse e implementarse de
otra forma, adems la clase derivada puede tener sus propios miembros y servir de clase base
para otras clases, logrndose la reutilizacin de objetos a travs de la herencia.

Otra forma de herencia es a travs del polimorfismo, que es una caracterstica de la POO que
consiste en definir una clase abstracta con propiedades y mtodos que sern implementados
de diferentes formas por otras clases, es decir, con un mismo nombre de propiedad o mtodo
se obtiene funcionalidad distinta de acuerdo al tipo de objeto.

En .NET solo existe herencia simple y no herencia mltiple, es decir, una clase derivada solo
puede heredar de una clase base. Haciendo una analoga, si a la clase base le llamamos
padre y a la clase derivada le llamamos hijo diramos que la herencia simple consiste en que
un hijo solo puede tener un solo padre, lo que parece algo natural y coherente.

Si deseamos simular herencia mltiple en Visual Basic .NET recurrimos a las interfaces, que
permiten definir propiedades y mtodos en una clase sin cdigo, luego desde una clase se
puede implementar varias interfaces, logrndose una herencia mltiple pero a nivel de
definicin y no de cdigo, ya que la implementacin ser distinta en cada clase.

En general, la herencia de clases permite reutilizar cdigo y facilitar el mantenimiento de las


aplicaciones, ya que cuando se desea modificar caractersticas de un objeto solo hay que
cambiar la clase adecuada.

Con .NET podemos implementar la herencia de cualquier clase pblica de la librera de clases
base, la cual tiene una gran cantidad de clases de diferentes tipos, tales como Windows, Data,

Tcnica de Programacin Orientada a Objetos

331

XML, ASP .NET, System, etc. Pero, tambin podemos implementar herencia de clases creadas
por nosotros, sin importar el lenguaje en que fueron creadas.

Implementando Herencia en una Clase


Para crear una herencia de clases se usa la instruccin Inherits seguida de la clase base de
donde se heredarn los miembros para la clase actual (clase derivada), tal como se muestra
debajo.

Sintaxis:
Inherits <Clase Base>

Notas:
Dos observaciones importantes que hay que tener en cuenta son:
1. La instruccin Inherits debe escribirse en la primera lnea de la clase derivada.
2. Solo puede existir una instruccin Inherits, ya que solo existe herencia simple.

Ejemplo:
Podemos crear una clase llamada Vendedor que herede de la clase Empleado que
habamos creado anteriormente, y crear dos propiedades, una llamada Venta y otra llamada
Comision, tal como sigue:

Public Class Vendedor


Inherits Empleado
Private mvarVenta As Single
Private mvarComision As Single

Property Venta() As Single


Get
Venta = mvarVenta
End Get
Set(ByVal Value As Single)
mvarVenta = Value

Tcnica de Programacin Orientada a Objetos

332

End Set

End Property

Property Comision() As Single


Get
Comision = mvarComision
End Get
Set(ByVal Value As Single)
mvarComision = Value
End Set

End Property

End Class

Finalmente, la clase Vendedor tendr

5 propiedades: 3 heredadas: Codigo, Nombre y Basico y 2 propias: Venta y


Comision.
2 mtodos heredados: CrearEmpleado y ActualizarBasico.
2 eventos heredados: BasicoBajo y BasicoAlto.

Tcnica de Programacin Orientada a Objetos

333

Sentencias para trabajar con Herencia


Para trabajar con herencia de clases existen varias instrucciones que hay que conocer tanto a
nivel de la clase como de sus miembros que definen las caractersticas de la herencia, las
cuales explicamos a continuacin.

Declaracin de Clases Base


Para declarar una clase base existen varias formas que fueron vistas en temas anteriores,
ahora afianzaremos solo los tipos de declaraciones que posibilitan o limitan el uso de herencia
de una clase base:

1. MustInherit
Permite crear una clase que solo sirva como clase base, es decir, que sirva solo para
implementar herencia en otras clases, pero no podr crearse objetos de esta clase.

Sintaxis:
MustInherit Class <Nombre Clase Base>
<Cdigo de la clase>
End Class

2. NotInheritable
Se usa para crear una clase que solo pueda crear objetos o aplicaciones clientes, pero que
no pueda servir para heredarse en otra clase.

Sintaxis:
NotInheritable Class <Nombre Clase>
<Cdigo de la clase>
End Class

Tcnica de Programacin Orientada a Objetos

334

SobreEscribiendo Propiedades y Mtodos en Clases


Derivadas
Para declarar una propiedad o mtodo en una clase derivada o clase que hereda de una clase
base, hay que tener ciertas consideraciones de acuerdo al tipo de declaracin, que se explican
a continuacin.

1. Overridable
Permite crear una propiedad o mtodo que puede ser sobre escrito en una clase derivada.
Esta declaracin se hace en la propiedad o mtodo de la clase base.

2. Overrides
Se usa para sobre escribir una propiedad o mtodo que fue definido como Overridable en
la clase base. Esta declaracin se hace en la propiedad o mtodo de la clase derivada.
3. NotOverridable
Impide que una propiedad o mtodo pueda ser sobre escrito en una clase derivada. La
definicin se realiza en la propiedad o mtodo de la clase base.
Por defecto, todas las propiedades o mtodos pblicos definidos en una clase base no
pueden ser sobre escritos en la clase derivada.
4. MustOverride
Permite crear una propiedad o mtodo que ser obligatorio sobre escribirlo en la clase
derivada. Esta declaracin se realiza en la propiedad o mtodo de la clase base que ha
sido definida como MustInherit.

Palabras claves MyBase y MyClass


Se puede usar las palabras clave MyBase y MyClass al trabajar con herencia, tal como se
muestra a continuacin:

1. MyBase
Se usa para llamar a miembros de la clase base desde la clase derivada. Es decir en vez
de usar el nombre de la clase seguido de la propiedad o mtodo se usa la palabra clave
MyBase seguida de la propiedad o mtodo.

Este tipo de llamada es til cuando se trabaja con mtodos sobre escritos en una clase
derivada y se necesita invocar al mtodo de la clase base que ser sobre escrito, tal como
se muestra en el siguiente ejemplo.

Tcnica de Programacin Orientada a Objetos

335

Ejemplo:
Suponiendo que el mtodo CrearEmpleado de la clase Empleado haya sido creado
como Overridable, y se desea sobre escribir en la clase Vendedor para calcular
correctamente el sueldo del vendedor incluyendo las comisiones, entonces, tendriamos lo
siguiente:

Public Class Vendedor


Inherits Empleado

Public Overrides Sub CrearEmpleado(ByVal vCodigo As Integer, _


ByVal vNombre As String, ByVal vSueldo As Single)
vSueldo = vSueldo + mvarVenta * mvarComision
MyBase.CrearEmpleado(vCodigo,vNombre,vSueldo)
End Sub

End Class

2. MyClass
Se usa para llamar a mtodos sobre escribibles desde la clase derivada, y diferenciarlos de
los mtodos heredados desde la clase base.

Tcnica de Programacin Orientada a Objetos

336

Polimorfismo
El polimorfismo consiste en la funcionalidad mltiple que puede tener un miembro de una clase
para comportarse de diversas maneras de acuerdo al tipo de objeto que lo implemente.

Existen dos formas de implementar el polimorfismo en Visual Basic .NET:

1. Polimorfismo basado en Herencia


Es una nueva forma de crear multiple funcionalidad para un mtodo de una clase base que
puede ser sobre escrito por otros mtodos con el mismo nombre en las clases derivadas.

Ejemplo:
Tomemos como caso el ejemplo anterior donde habamos sobre escrito el mtodo
CrearEmpleado de la clase Empleado modificandose en la clase derivada Vendedor
para incluir lo recibido por comisiones de ventas. Crearemos el mtodo llamado
MostrarSueldo que permita crear el empleado y mostrar cuanto gana, usando el
polimorfismo dependeiendo si es vendedor o no.

Sub MostrarSueldo(ByVal vEmpleado As Empleado, _


ByVal vCodigo As Integer, ByVal vNombre As String, _
ByVal vSueldo As Single)
vEmpleado.CrearEmpleado(vCodigo,vNombre,vSueldo)
MsgBox(vNombre & " gana s/. " & vSueldo)

End Sub

Sub ProbarPolimorfismo()
Dim objEmpleado As New Empleado
Dim objVendedor As New Vendedor
objEmpleado.CrearEmpleado(100, "Luis Dueas", 1000)
objVendedor.Venta=1000
objVendedor.Comision=0.10
objVendedor.CrearEmpleado(100, "Luis Dueas", 1000)

End Sub
Tcnica de Programacin Orientada a Objetos

337

En este ejemplo el resultado ser para el primer caso el mensaje Luis Dueas gana 1000
y en el segundo caso el mensaje Luis Dueas gana 1100.

2. Polimorfismo basado en Interfaces


Este tipo de polimorfismo se usa tambin en Visual Basic 6 y consiste en crear una
interface donde se definan nombres de propiedades y/o mtodos, y luego se implementen
con la sentencia Implements en varias clases, escribiendo diferentes cdigos o
implementaciones para las propiedades y mtodos de cada clase.

Este ltimo tipo de polimorfismo no se va a tratar, debido a que la manera natural de


implementar polimorfismo es a travs de la herencia de clases sobre escribiendo
propiedades o mtodos.

Las interfaces son un elemento bastante importante en .NET Framework, ya que de hecho
se utiliza con bastante frecuencia, en esta leccin veremos que son las interfaces y como
utilizarlas en nuestros proyectos, tambin veremos que papel juegan en .NET y cmo
aplicar algunas de las definidas en la biblioteca base.

Tcnica de Programacin Orientada a Objetos

338

Qu es una interfaz?
Las interfaces son una forma especial de una clase, aunque la diferencia principal con las
clases es que las interfaces no contienen cdigo ejecutable, solo definen los miembros.
Las interfaces se utilizan para indicar el "comportamiento" que tendr una clase, o al
menos qu miembros debe definir esa clase.
Para definir una interfaz en Visual Basic 2005 tenemos que usar la instruccin Interface
seguida del nombre de la interfaz y terminar la declaracin con End Interface:

Public Interface IAnimal


'...
End Interface

Nota:
Segn las indicaciones de nomenclatura de .NET Framework, se recomienda que todas las
interfaces empiecen con una I mayscula seguida del nombre al que hacer referencia la
interfaz.

Qu contiene una interfaz?


Al principio de esta leccin hemos comentado que las interfaces no contienen cdigo, solo
define los miembros que contiene. Esa definicin la haremos como cualquier otra, con la
diferencia de que no incluimos ningn cdigo, solo la "firma" o el prototipo de cada uno de
esos miembros.

En el siguiente cdigo definimos una interfaz que contiene los cuatros tipos de miembros
tpicos de cualquier clase:

Public Interface IPrueba


Sub Mostrar()
Function Saludo(ByVal nombre As String) As String
Property Nombre() As String
Event DatosCambiados()
End Interface

Tcnica de Programacin Orientada a Objetos

339

El primer miembro de esta interfaz, es un mtodo de tipo Sub que no recibe parmetros.
El siguiente mtodo es una funcin que devuelve un valor de tipo String y recibe un
parmetro tambin de tipo cadena.

A continuacin definimos una propiedad que devuelve una cadena.


Por ltimo, definimos un evento.

Como podemos observar, lo nico que tenemos que hacer es indicar el tipo de miembro y
si recibe o no algn parmetro o argumento.

Dos cosas importantes sobre las interfaces:


1- No se pueden definir campos.
2- Los miembros de las interfaces siempre son pblicos, tal como indicbamos en la tabla

Una interfaz es un contrato


Siempre que leemos sobre las interfaces, lo primero con lo que nos solemos encontrar es
que una interfaz es un contrato. Veamos que nos quieren decir con esa frase.
Tal como acabamos de ver, las interfaces solo definen los miembros, pero no el cdigo a
usar en cada uno de ellos, esto es as precisamente porque el papel que juegan las
interfaces es el de solo indicar que es lo que una clase o estructura puede, o mejor dicho,
debe implementar.

Si en una clase indicamos que queremos "implementar" una interfaz, esa clase debe definir
cada uno de los miembros que la interfaz expone. De esta forma nos aseguramos de que si
una clase implementa una interfaz, tambin implementa todos los miembros definidos en
dicha interfaz.
Cuando una clase implementa una interfaz est firmando un contrato con el que se
compromete a definir todos los miembros que la clase define, de hecho el propio
compilador nos obliga a hacerlo.

Las interfaces y el polimorfismo


Como comentamos anteriormente, el polimorfismo es una caracterstica que nos permite
acceder a los miembros de un objeto sin necesidad de tener un conocimiento exacto de
ese objeto (o de la clase a partir del que se ha instanciado), lo nico que tenemos que
saber es que ese objeto tiene ciertos mtodos (u otros miembros) a los que podemos
acceder. Tambin hemos comentado que las interfaces representan un contrato entre las
clases que las implementan, por tanto las interfaces pueden ser, (de hecho lo son), un
medio para poner en prctica esta caracterstica de la programacin orientada a objetos. Si
una clase implementa una interfaz, esa clase tiene todos los miembros de la interfaz, por

Tcnica de Programacin Orientada a Objetos

340

tanto podemos acceder a esa clase, que en principio pude sernos desconocida, desde un
objeto del mismo tipo que la interfaz.

Usar una interfaz en una clase


Para poder utilizar una interfaz en una clase, o dicho de otra forma: para "implementar" los
miembros expuestos por una interfaz en una clase debemos hacerlo mediante la
instruccin Implements seguida del nombre de la interfaz:

Public Class Prueba


Implements IPrueba

Y como comentbamos, cualquier clase que implemente una interfaz debe definir cada uno
de los miembros de esa interfaz, por eso es el propio Visual Basic el encargado de crear
automticamente los mtodos y propiedades que la interfaz implementa, aunque solo
inserta el "prototipo" de cada uno de esos miembros, dejando para nosotros el trabajo de
escribir el cdigo.

Usando la definicin de la interfaz IPrueba que vimos antes, el cdigo que aadir VB ser
el siguiente:

Public Class Prueba


Implements IPrueba

Public Event DatosCambiados() Implements IPrueba.DatosCambiados

Public Sub Mostrar() Implements IPrueba.Mostrar

End Sub

Public Property Nombre() As String Implements IPrueba.Nombre


Get

End Get

Tcnica de Programacin Orientada a Objetos

341

Set(ByVal value As String)

End Set
End Property

Public Function Saludo(ByVal nombre As String) As String _


Implements IPrueba.Saludo

End Function
End Class

Como podemos apreciar, no solo ha aadido las definiciones de cada miembro de la


interfaz, sino que tambin aade cdigo extra a cada uno de esos miembros: la instruccin
Implements seguida del nombre de la interfaz y el miembro al que se har referencia.

La utilidad de que en cada uno de los miembros se indique expresamente el mtodo al que
se hace referencia, es que podemos usar nombres diferentes al indicado en la interfaz. Por
ejemplo, si implementamos esta interfaz en una clase que solo utilizar la impresora, al
mtodo Mostrar lo podramos llamar Imprimir que sera ms adecuado, en ese caso
simplemente cambiamos el nombre del mtodo de la clase para que implemente el mtodo
Mostrar de la interfaz:

Public Sub Imprimir() Implements IPrueba.Mostrar

End Sub

De esta forma, aunque en la clase se llame de forma diferente, realmente hace referencia
al mtodo de la interfaz.

Acceder a los miembros implementados

Una vez que tenemos implementada una interfaz en nuestra clase, podemos acceder a
esos miembros de forma directa, es decir, usando un objeto creado a partir de la clase:

Dim prueba1 As New Prueba

Tcnica de Programacin Orientada a Objetos

342

prueba1.Mostrar()

O bien de forma indirecta, por medio de una variable del mismo tipo que la interfaz:

Dim prueba1 As New Prueba


Dim interfaz1 As IPrueba
interfaz1 = prueba1
interfaz1.Mostrar()

Qu ha ocurre aqu?
Como ya comentamos anteriormente, cuando asignamos variables por referencia,
realmente lo que asignamos son referencias a los objetos creados en la memoria, por tanto
la variable interfaz1 est haciendo referencia al mismo objeto que prueba1, aunque esa
variable solo tendr acceso a los miembros de la clase Prueba que conoce, es decir, los
miembros definidos en IPrueba.

Si la clase define otros miembros que no estn en la interfaz, la variable interfaz1 no podr
acceder a ellos.

Saber si un objeto implementa una interfaz


Si las interfaces sirven para acceder de forma annima a los mtodos de un objeto, es
normal que en Visual Basic tengamos algn mecanismo para descubrir si un objeto
implementa una interfaz.

Para realizar esta comprobacin podemos usar en una expresin If/Then la instruccin
TypeOf... Is, de forma que si la variable indicada despus de TypeOf contiene el tipo
especificado despus de Is, la condicin se cumple:

If TypeOf prueba1 Is IPrueba Then


interfaz1 = prueba1

interfaz1.Mostrar()
End If

Tcnica de Programacin Orientada a Objetos

343

De esta forma nos aseguramos de que el cdigo se ejecutar solamente si la variable


prueba1 contiene una definicin de la interfaz IPrueba.

Implementacin de mltiples interfaces


En Visual Basic 2005, una misma clase puede implementar ms de una interfaz. Para
indicar que implementamos ms de una interfaz podemos hacerlo de dos formas:

1- Usando nuevamente la instruccin Implements seguida del nombre de la interfaz:

Public Class Prueba


Implements IPrueba
Implements IComparable

2- Indicando las otras interfaces en la misma instruccin Implements, pero separndolas


con comas:

Public Class Prueba


Implements IPrueba, IComparable

De cualquiera de las dos formas es vlido implementar ms de una interfaz, aunque en


ambos casos siempre debemos definir los miembros de cada una de esas interfaces.
Mltiple implementacin de un mismo miembro

Como acabamos de comprobar, una misma clase puede implementar ms de una interfaz,
y esto nos puede causar una duda:

Tcnica de Programacin Orientada a Objetos

344

Qu ocurre si dos interfaces definen un mtodo que es idntico


en ambas?
En principio, no habra problemas, ya que el propio Visual Basic creara dos mtodos con
nombres diferentes y a cada uno le asignara la implementacin de ese mtodo definido en
cada interfaz.
Por ejemplo, si tenemos otra interfaz que define el mtodo Mostrar y la implementamos en
la clase Prueba, la declaracin podra quedar de esta forma:

Public Interface IMostrar


Sub Mostrar()
End Interface

Public Sub Mostrar1() Implements IMostrar.Mostrar

End Sub

Aunque si ambos mtodos hacen lo mismo, en este ejemplo mostrar algo, podramos hacer
que el mismo mtodo de la clase sirva para implementar el de las dos interfaces:
Public Sub Mostrar() Implements IPrueba.Mostrar, IMostrar.Mostrar

End Sub

Es decir, lo nico que tendramos que hacer es indicar la otra implementacin separndola
con una coma.

Dnde podemos implementar las interfaces?


Para ir acabando este tema nos queda por saber, entre otras cosas, dnde podemos
implementar las interfaces, es decir, en que tipos de datos podemos usar Implements.
La implementacin de interfaces la podemos hacer en las clases (Class), estructuras
(Structure) y en otras interfaces (Interface).
Debido a que una interfaz puede implementar otras interfaces, si en una clase
implementamos una interfaz que a su vez implementa otras, esa clase tendr definidas
cada una de las interfaces, lo mismo ocurre con una clase que "se derive" de otra clase
que implementa alguna interfaz, la nueva clase tambin incorporar esa interfaz.

Tcnica de Programacin Orientada a Objetos

345

Nota:
Cuando una interfaz implementa otras interfaces, stas no se pueden indicar mediante
Implements, en lugar de usar esa instruccin debemos usar Inherits.
Public Interface IPrueba2
Inherits IMostrar

Si en una clase implementamos una interfaz que a su vez implementa otras interfaces, esa
clase tendr definiciones de todos los miembros de todas las interfaces, por ejemplo, si
tenemos la siguiente definicin de la interfaz IPrueba2 que "implementa" la interfaz
IMostrar:

Public Interface IPrueba2


Inherits IMostrar

Function Saludo(ByVal nombre As String) As String


Property Nombre() As String
Event DatosCambiados()
End Interface

Y la clase Prueba2 implementa IPrueba2, la definicin de los miembros quedara de la


siguiente forma:

Public Class Prueba2


Implements IPrueba2

Public Sub Mostrar() Implements IMostrar.Mostrar

End Sub

Public Event DatosCambiados() Implements IPrueba2.DatosCambiados

Public Property Nombre() As String Implements IPrueba2.Nombre


Get

Tcnica de Programacin Orientada a Objetos

346

End Get
Set(ByVal value As String)

End Set
End Property

Public Function Saludo(ByVal nombre As String) As String _


Implements IPrueba2.Saludo

End Function
End Class

En este cdigo, el mtodo Mostrar se indica mediante la interfaz IMostrar, pero tambin se
puede hacer por medio de IPrueba2.Mostrar, ya que IPrueba2 tambin lo implementa (o
hereda).

Si dejamos que Visual Basic cree los miembros, no tendremos problemas a la hora de
definirlos. Pero si lo hacemos manualmente, aunque dentro del IDE de Visual Basic, ste
nos ayuda indicndonos que interfaces implementamos y qu miembros son los que se
adecuan a la declaracin que estamos usando, tal como podemos comprobar en la figura
2.16:

Tcnica de Programacin Orientada a Objetos

347

Un ejemplo prctico usando una interfaz de .NET


Tal como comentamos al principio, el propio .NET est "plagado" de interfaces, cada una
de ellas tiene un fin concreto, por ejemplo, si queremos definir una clase que pueda ser
clasificada por el propio .NET, esa clase debe implementar la interfaz IComparable, ya que
el mtodo Sort, (de la clase que contiene los elementos del tipo definido por nosotros), que
es el encargado de clasificar los elementos, har una llamada al mtodo
IComparable.CompareTo de cada uno de los objetos que queremos clasificar, por tanto, si
la clase no ha definido esa interfaz, no podremos clasificar los elementos que contenga.

En el siguiente cdigo tenemos la definicin de una clase llamada Empleado que


implementa la interfaz IComparable y en el mtodo CompareTo hace la comprobacin de
que objeto es mayor o menor, si el de la propia clase o el indicado en el parmetro de esa
funcin:

Public Class Empleado


Implements IComparable

Public Nombre As String

Public Sub New(ByVal nombre As String)


Me.Nombre = nombre

End Sub

' Si el objeto es del tipo Empleado, comparamos los nombres.


' Si no es del tipo Empleado, devolvemos un cero
' que significa que los dos objetos son iguales.
Public Function CompareTo(ByVal obj As Object) As Integer _
Implements System.IComparable.CompareTo
If TypeOf obj Is Empleado Then
Dim e1 As Empleado = CType(obj, Empleado)

Return String.Compare(Me.Nombre, e1.Nombre)


Else
Return 0

Tcnica de Programacin Orientada a Objetos

348

End If
End Function
End Class

En el mtodo CompareTo hacemos una comprobacin de que el objeto con el que


debemos realizar la comparacin es del tipo Empleado, en ese caso convertimos el objeto
pasado en uno del tipo Empleado y comparamos los nombres.

Si el objeto que recibe el mtodo no es del tipo Empleado, devolvemos un cero, para
indicar que no haga ninguna clasificacin, ya que ese valor indica que los dos objetos son
iguales.

Esta comparacin no es estrictamente necesaria, ya que si no indicamos el valor que debe


devolver una funcin, devolver un valor cero, al menos en este caso, ya que el tipo a
devolver es un nmero entero.

Esta clase la podemos usar de esta forma:


' Una coleccin de datos del tipo Empleado.
Dim empleados As New System.Collections.Generic.List(Of Empleado)

' Aadimos varios empleados a la coleccin.


empleados.Add(New Empleado("Pepe"))
empleados.Add(New Empleado("Bernardo"))
empleados.Add(New Empleado("Juan"))
empleados.Add(New Empleado("Ana"))

' Clasificamos los empleados de la coleccin.


empleados.Sort()

' Mostramos los datos una vez clasificados.


For Each e1 As Empleado In empleados
Console.WriteLine(e1.Nombre)
Next

Tcnica de Programacin Orientada a Objetos

349

Contenido.

Manejo de Colecciones
o Concepto de Colecciones. Tipos.
o Agregar y remover tems de una coleccin.
o Recorrer los tems de una coleccin.
Colecciones Especializadas: ArrayList, HashTable
Interfaces
o IEnumerable e IEnumerator
o ICloneable
o IComparable

Las Colecciones
En el tema sobre arrays hemos comprobado cmo a travs de la clase Array, podemos
manipular estos elementos del lenguaje con una mayor potencia y flexibilidad que en pasadas
versiones del lenguaje. No obstante, en muchas ocasiones nos encontraremos con situaciones
en las que sera muy de agradecer que los arrays dispusieran de algunas caractersticas
adicionales, dependiendo del problema que tengamos que resolver en ese preciso momento.
Por ejemplo, sera una gran idea poder manejar un array que creciera dinmicamente, sin tener
que preocuparnos por aumentar o disminuir su tamao; o tambin, disponer de un array a
cuyos valores pudiramos acceder, a travs de identificadores claves, y no por el nmero de
ndice, que en algunas situaciones es ms incmodo de manejar.
Aun as no hay que preocuparse, ya que no va a necesitar escribir complicados algoritmos para
implementar estas caractersticas en sus arrays. Todas las funcionalidades mencionadas, y
algunas ms, se encuentran disponibles en un tipo especial de array denominado coleccin
(collection).
Una coleccin es un objeto que internamente gestiona un array, pero que est preparado,
dependiendo del tipo de coleccin, para manejar el array que contiene de una manera especial;
podramos definirlo como un array optimizado o especializado en ciertas tareas.

Tcnica de Programacin Orientada a Objetos

350

El espacio de nombres System.Collections


Este espacio de nombres del entorno de .NET Framework, es el encargado de agrupar el
conjunto de clases e interfaces que nos permiten la creacin de los distintos tipos de objetos
collection. Por lo que si necesitamos un array con alguna caracterstica especial, slo hemos
de instanciar un objeto de alguna de las clases de este espacio de nombres para disponer de
un array con esa funcionalidad. Entre las clases ms significativas de System.Collections,
podemos destacar las siguientes.
ArrayList. Proporciona una coleccin, cuyo array es redimensionado dinmicamente.
Hashtable. Las colecciones de este tipo, contienen un array cuyos elementos se basan
en una combinacin de clave y valor, de manera que el acceso a los valores se facilita,
al realizarse mediante la clave.
SortedList. Consiste en una coleccin ordenada de claves y valores.
Queue. Representa una lista de valores, en el que el primer valor que entra, es el
primero que sale.
Stack. Representa una lista de valores, en el que el ltimo valor que entra, es el
primero que sale.

Para hacer uso de colecciones en una aplicacin VB.NET creada desde VS.NET, no es
necesario importar este espacio de nombres, ya que como habr observado el lector en
ejemplos anteriores, el propio IDE incluye por defecto la importacin del espacio System al
proyecto.

La clave se halla en los interfaces


Las clases integrantes de System.Collections implementan en mayor o menor grado, un
conjunto comn de interfaces, que proporcionan la funcionalidad para el trabajo con arrays
especializados o colecciones. Entre alguno de los interfaces de Collections, podemos
mencionar los siguientes.

IEnumerable. Proporciona el soporte para recorrer colecciones de valores.


ICollection. Proporciona las caractersticas para manipular el tamao, gestionar
enumeradores, etc., de listas de valores.
IList. Referencia a una lista de valores que puede ordenarse.
ICloneable. Permite la creacin de copias exactas e independientes de objetos.

Todo ello significa, que adems de las clases con las funcionalidades especiales de
Collections, podemos crear nuestras propias clases, para aquellos casos en los que
necesitemos disponer de un array con funcionalidades especiales, no contempladas por los
arrays base, y que adems tampoco exista como coleccin. La manera de crear nuestro propio
tipo de coleccin sera heredando de una clase collection existente y/o la implementacin de
alguno de los interfaces de Collections.

Seguidamente realizaremos una descripcin general y pruebas con algunas de las colecciones
existentes en el entorno, remitiendo al lector a la documentacin de la plataforma accesible
desde Visual Studio .NET para los detalles ms especficos.

Tcnica de Programacin Orientada a Objetos

351

La clase ArrayList
Los objetos de tipo coleccin creados con esta clase, implementan un array cuyo nmero de
elementos puede modificarse dinmicamente.

Instanciacin de objetos ArrayList

Podemos instanciar una coleccin ArrayList en alguno los modos mostrados en el Cdigo
fuente. Observe cmo en el ltimo ejemplo de este fuente, el constructor de ArrayList recibe
como parmetro una coleccin dinmica.

Sub Main()
' crear una lista sin elementos
Dim alEstaciones As New ArrayList()
' crear una lista indicando el nmero de elementos
' pero sin darles valor
Dim alDatos As New ArrayList(3)
' crear una lista utilizando una coleccin dinmica
Dim alLetras As New ArrayList(New String() {"a", "b", "c"})
End Sub
Una coleccin dinmica se crea de forma muy similar a un array, con la diferencia de que no es
necesario usar una variable a la que asignar la coleccin, ya que en su lugar, se pasa como
parmetro al constructor de ArrayList. El modo de creacin de una coleccin dinmica consiste
en utilizar la palabra clave New, seguida del tipo de dato de la coleccin, los parntesis
indicativos de array, y por ltimo, encerrados entre llaves, los valores de la coleccin.

Agregar valores a un ArrayList


Una vez creado un ArrayList, podemos utilizar algunos de los mtodos indicados a
continuacin para aadir valores a la coleccin.
Add(Valor). Aade el valor representado por Valor.
AddRange(Coleccin). Aade un conjunto de valores mediante un objeto del interfaz
ICollection, es decir, una coleccin dinmica creada en tiempo de ejecucin.
Insert(Posicin, Valor). Inserta el valor Valor en la posicin Posicin del array,
desplazando el resto de valores una posicin adelante.
InsertRange(Posicin, Coleccin). Inserta un conjunto de valores mediante una
coleccin dinmica, a partir de una posicin determinada dentro del array.
SetRange(Posicin, Coleccin). Sobrescribe elementos en un array con los valores
de la coleccin Coleccin, comenzando en la posicin Posicin.

Tcnica de Programacin Orientada a Objetos

352

El cdigo fuente siguiente muestra algunos ejemplos de asignacin de nuevos valores a un


ArrayList.

Sub Main()
Dim alDatos As New ArrayList(10)
alDatos.Add("a")
alDatos.AddRange(New String() {"b", "c", "d"})
Console.WriteLine("ArrayList despus de usar Add() y AddRange()")
RecorrerAList(alDatos)
alDatos.Insert(2, "hola")
Console.WriteLine("ArrayList despus de usar Insert()")
RecorrerAList(alDatos)
alDatos.InsertRange(1, New Integer() {55, 77, 88})
Console.WriteLine("ArrayList despus de usar InsertRange()")
RecorrerAList(alDatos)
alDatos.SetRange(3, New String() {"zzz", "yyy"})
Console.WriteLine("ArrayList despus de usar SetRange()")
RecorrerAList(alDatos)
Console.ReadLine()
End Sub

Private Sub RecorrerAList(ByVal alValores As ArrayList)


Dim oEnumerador As IEnumerator = alValores.GetEnumerator()
While oEnumerador.MoveNext()
Console.WriteLine("Valor: {0}", oEnumerador.Current)
End While
Console.WriteLine()
End Sub

Tcnica de Programacin Orientada a Objetos

353

Los valores que espera recibir una coleccin son del tipo genrico Object, por lo que podemos
insertar valores de diferentes tipos de dato.

Recorrer y obtener valores de un ArrayList

Para recorrer un array podemos emplear la tcnica habitual del bucle For...Next y la propiedad
Count del objeto ArrayList, que devuelve el nmero de elementos que tiene el objeto; o bien
podemos usar un objeto del interfaz IEnumerator, proporcionado por el mtodo
GetEnumerator(), mucho ms simple de recorrer.

Sub Main()
' crear ArrayList y aadir valores

Dim alLetras As New ArrayList(6)


alLetras.Add("a")
alLetras.AddRange(New String() {"b", "c", "d"})
' recorrer con un bucle For y usando la propiedad Count,
' tener en cuenta que al ser cero el primer ndice del array,
' tenemos que restar uno a la propiedad Count

Console.WriteLine("Recorrer objeto ArrayList con bucle For")


Dim iContador As Integer
For iContador = 0 To (alLetras.Count - 1)
Console.WriteLine("Elemento actual {0}, valor: {1}", _
iContador, alLetras(iContador))
Next
Console.WriteLine()
' recorrer el array con un enumerador

Console.WriteLine("Recorrer objeto ArrayList con un enumerador")


Dim oEnumerador As IEnumerator
oEnumerador = alLetras.GetEnumerator()
While oEnumerador.MoveNext()
Console.WriteLine("Elemento de la lista: {0}", oEnumerador.Current())
End While
Console.ReadLine()
End Sub
Tcnica de Programacin Orientada a Objetos

354

Capacidad y valores en una coleccin ArrayList


Cuando manipulamos un objeto ArrayList debemos distinguir entre los conceptos capacidad y
valores asignados. La capacidad de un ArrayList hace referencia al nmero de elementos del
array subyacente que contiene este objeto, mientras que los valores asignados se refieren a
aquellos elementos del array a los que se ha asignado valor mediante mtodos como Add( ) o
AddRange( ). Podemos obtener esta informacin a travs de las propiedades Capacity y Count
del objeto coleccin.

Console.WriteLine("Valores asignados al array: {0}", alLetras.Count)


Console.WriteLine("Capacidad del array: {0}", alLetras.Capacity)

La capacidad es un aspecto de la clase ArrayList que mejora el rendimiento a la hora de aadir


o eliminar elementos del array. Analicemos esta caracterstica con ms detenimiento. En primer
lugar, todo objeto ArrayList dispone de una propiedad oculta llamada _items, conteniendo el
array que internamente gestiona los valores asignados. Esta es una propiedad que no puede
manipular el programador, pero que puede visualizar a travs del depurador, abriendo la
ventana Locales y expandiendo el contenido de un objeto ArrayList.

Cuando creamos un objeto ArrayList con un tamao como el del ltimo ejemplo, la accin de
aadir un valor a la coleccin no redimensiona su array subyacente, puesto que ya est creado
con un tamao determinado, sino que asigna un valor al siguiente elemento libre que no
hubiera sido previamente asignado.

Tcnica de Programacin Orientada a Objetos

355

Este comportamiento del objeto tiene la ventaja de que mejora el rendimiento y optimiza
recursos, puesto que cada vez que aadimos o eliminamos valores, el array _items no siempre
tiene que ser redimensionado.

Qu sucede, sin embargo, cuando se han aadido valores y el array est completo?, pues
que el objeto ArrayList detecta esta situacin y en la siguiente ocasin en que se aade un
nuevo valor, automticamente redimensiona el array _items, duplicando el nmero de
elementos inicial que contena.

En el caso que muestra la anterior figura, despus de aadir la letra m al objeto, la propiedad
Capacity devolvera 12 y la propiedad Count devolvera 9.

Tcnica de Programacin Orientada a Objetos

356

Un detalle muy importante que debe tener en cuenta el lector, es que al crear un objeto
ArrayList, si no especificamos el tamao, la propiedad _items tiene una capacidad por defecto
de 16 elementos.

Obtencin de subarrays a partir de un objeto ArrayList


La clase ArrayList nos proporciona mtodos tanto para obtener un fragmento o rango
(subarray) de un objeto ArrayList, como para crear nuevos objetos mediante mtodos shared o
compartidos. Entre este tipo de mtodos, se encuentran los siguientes.

GetRange(Posicin, Elementos). Obtiene un subarray comenzando en el ndice


Posicin, y tomando el nmero que indica Elementos.
FixedSize(ArrayList). Mtodo compartido que crea un array de tamao fijo a partir de
un objeto ArrayList pasado como parmetro. Sobre el nuevo array obtenido, podemos
modificar los elementos existentes, pero no aadir nuevos.
Repeat(Valor, Cantidad). Mtodo compartido que crea un ArrayList de valores
repetidos, tomando como valor a repetir el parmetro Valor, y creando tantos
elementos como se especifica en el parmetro Cantidad.
ToArray(). Copia los elementos del ArrayList en un objeto Array, al ser ambos arrays
independientes, el objeto sobre el que se han copiado los elementos puede modificarse
sin que afecte al ArrayList.
ReadOnly( ). Mtodo compartido que crea un objeto ArrayList de slo lectura a partir
de un array existente.

Sub Main()
Dim alLetras As New ArrayList(10)
alLetras.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})
Console.WriteLine("Array alLetras")
RecorrerAList(alLetras)
' obtener un subarray con un rango determinado
Dim alRangoLetras As ArrayList
alRangoLetras = alLetras.GetRange(4, 2)
Console.WriteLine("Array alRangoLetras")
RecorrerAList(alRangoLetras)
' obtener un subarray de tamao fijo,
' se pueden modificar sus elementos,
' no se pueden aadir valores
Dim alLetrasFijo As ArrayList = ArrayList.FixedSize(alLetras)
Tcnica de Programacin Orientada a Objetos

357

'alLetrasFijo.Add("m") <-- esto provocara error


alLetrasFijo(2) = "vvv"
Console.WriteLine("Array alLetrasFijo")
RecorrerAList(alLetrasFijo)
' ArrayList de valores repetidos
Dim alRepetidos As ArrayList
alRepetidos = ArrayList.Repeat("hola", 3)
alRepetidos.Add("otro valor")
Console.WriteLine("Array alRepetidos")
RecorrerAList(alRepetidos)
' copiar ArrayList sobre un array normal
Dim aNuevo As Array
aNuevo = alLetras.ToArray()
aNuevo(2) = "zzz"
Console.WriteLine("Array aNuevo")
RecorrerArray(aNuevo)
' crear ArrayList de slo lectura
' a partir de un array existente
Dim alLetrasSoloLeer As ArrayList = ArrayList.ReadOnly(alLetras)
' solamente podemos recorrerlo
Console.WriteLine("ArrayList de slo lectura")
RecorrerAList(alLetrasSoloLeer)
' las dos lneas siguientes provocaran un error
'alLetrasSoloLeer.Add("yyy")
'alLetrasSoloLeer(2) = "wwer"
Console.ReadLine()
End Sub

Tcnica de Programacin Orientada a Objetos

358

Private Sub RecorrerAList(ByVal alValores As ArrayList)


Dim oEnumerador As IEnumerator = alValores.GetEnumerator()
While oEnumerador.MoveNext()
Console.WriteLine("Valor: {0}", oEnumerador.Current)
End While
Console.WriteLine()
End Sub

Private Sub RecorrerArray(ByVal aValores As Array)


Dim oEnumerador As IEnumerator = aValores.GetEnumerator()
While oEnumerador.MoveNext
Console.WriteLine("Valor: {0}", oEnumerador.Current)
End While
Console.WriteLine()
End Sub

Respecto a los ArrayList de tamao fijo, tipo FixedSize, queremos advertir al lector que a la
hora de ver su contenido en el depurador, no debe consultar la propiedad _items mencionada
anteriormente, ya que esta contendr un array de valores vacos.

Este punto puede crear confusin, ya que el lector al ejecutar la aplicacin s obtendr los
valores de la coleccin FixedSize, por lo que se preguntar dnde han ido a parar esos valores.
El secreto reside en el siguiente lugar: al ejecutar con el depurador, debemos expandir la
propiedad [System.Collections.ArrayList.FixedSizeArrayList] del ArrayList con tamao fijo.
Dentro de esta propiedad, que es realmente una variante del objeto ArrayList, abriremos la
propiedad _list, y de nuevo dentro de esta propiedad encontraremos otra con el nombre _items,
la cual ser la que contiene realmente los valores del array de tamao fijo.

Tcnica de Programacin Orientada a Objetos

359

Bsquedas en colecciones ArrayList


Adems de los mtodos IndexOf( ) y LastIndexOf( ), disponibles en los arrays estndar, un
ArrayList aporta el mtodo Contains( ), que nos devuelve un valor lgico indicando si el valor
pasado como parmetro existe en el array.

Sub Main()
Dim alLetras As New ArrayList(10)
alLetras.AddRange(New String() {"jj", "oo", "aa", _
"jj", "ee", "tt", "mm", "xx"})
Dim iPosicIndexOf As Integer
' buscar un elemento de la coleccin desde el principio
iPosicIndexOf = alLetras.IndexOf("aa")
Console.WriteLine("Posicin al buscar con IndexOf: {0}", iPosicIndexOf)
Dim iPosicLastIndexOf As Integer
' buscar un elemento de la coleccin desde el final
iPosicLastIndexOf = alLetras.LastIndexOf("jj")
Console.WriteLine("Posicin al buscar con LastIndexOf: {0}", _
iPosicLastIndexOf)
Dim bEncontrado As Boolean
' comprobar si existe un valor en la coleccin
bEncontrado = alLetras.Contains("oo")
Console.WriteLine("Resultado de la bsqueda con Contains: {0}", bEncontrado)
Console.ReadLine()
End Sub

Tcnica de Programacin Orientada a Objetos

360

Borrado de elementos en una coleccin ArrayList


Para realizar un borrado de valores, la clase ArrayList proporciona los mtodos descritos a
continuacin.

Remove(Valor). Elimina el elemento del array que corresponde a Valor.


RemoveAt(Posicion). Elimina el elemento del array situado en el ndice Posicin.
RemoveRange(Posicin, Elementos). Elimina el conjunto de elementos indicados en
el parmetro Elementos, comenzando por el ndice Posicin.
Clear( ). Elimina todos los elementos del objeto.

Debido a las causas de optimizacin en cuanto a ejecucin comentadas en un apartado


anterior, al borrar elementos de un ArrayList, el valor de la propiedad Capacity permanece
inalterable. Eso quiere decir que si aadimos muchos valores a un ArrayList para despus
eliminar gran parte de ellos, el array subyacente de la propiedad _items no disminuir su
tamao para ahorrar recursos. Esto no es algo preocupante sin embargo, puesto que si
utilizamos el mtodo TrimToSize( ) de esta clase, conseguiremos que el tamao o capacidad
del ArrayList se ajuste al nmero real de elementos que contiene.

Sub Main()
' borra todos los elementos
Dim alLetras1 As New ArrayList(10)
alLetras1.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})
alLetras1.Clear()
Estado("alLetras1", alLetras1)
' borra un elemento por el valor
Dim alLetras2 As New ArrayList(10)
alLetras2.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})
alLetras2.Remove("c")
Estado("alLetras2", alLetras2)
' borra un elemento por posicin
Dim alLetras3 As New ArrayList(10)
alLetras3.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})
alLetras3.RemoveAt(5)
Estado("alLetras3", alLetras3)
Tcnica de Programacin Orientada a Objetos

361

' borra un rango de elementos por posicin


Dim alLetras4 As New ArrayList(10)
alLetras4.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})
alLetras4.RemoveRange(2, 3)
Console.WriteLine("Array alLetras4: estado antes de reajustar tamao")
Estado("alLetras4", alLetras4)
' reajustar capacidad del array
alLetras4.TrimToSize()
Console.WriteLine("Array alLetras4: estado despus de reajustar tamao")
Estado("alLetras4", alLetras4)
Console.ReadLine()
End Sub

Public Sub Estado(ByVal sNombre As String, ByVal alValores As ArrayList)


Console.WriteLine("Array: {0} / Capacidad: {1} / Nmero de elementos: {2}",
_sNombre, alValores.Capacity, alValores.Count)
Console.WriteLine()
End Sub

Ordenar elementos en un objeto ArrayList


Al igual que en la clase base Array, los objetos ArrayList disponen del mtodo Sort( ), que
ordena los elementos del array; y del mtodo Reverse( ), que invierte las posiciones de un
nmero determinado de elementos del array. El Cdigo fuente 374 muestra un ejemplo de cada
uno.

Sub Main()
Dim alLetras As New ArrayList(10)
alLetras.AddRange(New String() {"z", "t", "c", "a", "k", "f", "m"})
' ordenar
alLetras.Sort()
Tcnica de Programacin Orientada a Objetos

362

Console.WriteLine("ArrayList despus de ordenar")


RecorrerAList(alLetras)
' invertir posiciones de elementos
alLetras.Reverse(3, 3)
Console.WriteLine("ArrayList despus de invertir elementos")
RecorrerAList(alLetras)
Console.ReadLine()
End Sub

Private Sub RecorrerAList(ByVal alValores As ArrayList)


Dim oEnumerador As IEnumerator = alValores.GetEnumerator()
While oEnumerador.MoveNext()
Console.WriteLine("Valor: {0}", oEnumerador.Current)
End While
Console.WriteLine()
End Sub

Tcnica de Programacin Orientada a Objetos

363

La clase Hashtable
Esta clase tiene la particularidad de que el acceso a los valores del array que gestiona
internamente se realiza a travs de una clave asociada a cada elemento, al estilo de los
objetos Dictionary de versiones anteriores de VB. Como dato significativo, esta clase
implementa el interfaz IDictionary, por lo que si hemos utilizado anteriormente objetos
Dictionary, ya conocemos gran parte de su filosofa de trabajo.

En este tipo de coleccin no es necesario preocuparse por la posicin o ndice de los


elementos, ya que accedemos a ellos a travs de literales, lo cual en algunas circunstancias es
mucho ms cmodo de manejar.

Manejo bsico de colecciones Hashtable


Supongamos como ejemplo, que un proceso en una aplicacin necesita guardar de forma
temporal, datos de un cliente en un array. Podemos naturalmente utilizar un array estndar
para tal fin, como se muestra:

Dim aCliente = Array.CreateInstance(GetType(Object), 6)


aCliente(0) = 22
aCliente(1) = "Pedro"
aCliente(2) = "Naranjo"
aCliente(3) = "C/Rio Bravo, 25"
aCliente(4) = 35
aCliente(5) = 250

En un planteamiento como el anterior, debemos acordarnos, a la hora de obtener los datos del
array, que la primera posicin corresponde al cdigo de cliente, la siguiente al nombre, etc.,.
Bien es cierto que podemos utilizar constantes numricas para cada posicin, pero sigue
siendo una solucin poco flexible.

Utilizando un objeto Hashtable sin embargo, tenemos la ventaja de que no necesitamos saber
la posicin en que se encuentra cada valor, ya que precisamente a cada posicin le damos un
nombre clave que es mediante el que accedemos posteriormente cuando queremos obtener
los valores.

Tcnica de Programacin Orientada a Objetos

364

Sub Main()
' declarar coleccin Hashtable
Dim htCliente As Hashtable
htCliente = New Hashtable()
' aadir valores
htCliente.Add("ID", 22)
htCliente.Add("Nombre", "Pedro")
htCliente.Add("Apellidos", "Naranjo")
htCliente.Add("Domicilio", "C/Rio Bravo, 25")
htCliente.Add("Edad", 35)
htCliente.Add("Credito", 250)
' mostrar el nmero de elementos que contiene
Console.WriteLine("El objeto Hashtable tiene {0} elementos", _
htCliente.Count)
Console.WriteLine()
' obtener algunos valores
Console.WriteLine("Obtener algunos valores del objeto Hashtable")
Console.WriteLine("Domicilio: {0} ", htCliente.Item("Domicilio"))
Console.WriteLine("Nombre: {0} ", htCliente("Nombre"))
Console.WriteLine("Credito: {0} ", htCliente("Credito"))
Console.WriteLine()
' recorrer el array al completo
Console.WriteLine("Recorrer objeto Hashtable con un enumerador")
Dim oEnumerador As IDictionaryEnumerator
oEnumerador = htCliente.GetEnumerator()

Tcnica de Programacin Orientada a Objetos

365

While oEnumerador.MoveNext()
Console.WriteLine("Clave: {0} / Valor: {1}", _
oEnumerador.Key, oEnumerador.Value)
End While
Console.ReadLine()
End Sub

Para crear un nuevo objeto Hashtable hemos utilizado el constructor sin parmetros, que es el
ms bsico disponible. Puesto que se trata de un constructor sobrecargado, sugerimos al lector
que consulte la documentacin de .NET Framework para ver una lista completa de todos los
constructores disponibles.

Respecto a la asignacin de valores a la coleccin, esta clase utiliza el mtodo Add( ), cuyo
primer parmetro corresponde a la clave del elemento y el segundo corresponde al valor que
vamos a asignar a la posicin de su array.

Para obtener un valor del array utilizamos el mtodo Item( ), pasando como parmetro el
nombre de la clave de la que vamos a obtener el valor correspondiente. Al tratarse del mtodo
por defecto de esta clase no es necesario especificarlo. Como hemos podido comprobar, el
resultado es el mismo tanto si especificamos como si no el nombre del mtodo.

Si queremos recorrer el array al completo contenido en el objeto, podemos utilizar el mtodo


GetEnumerator( ), que nos devuelve un enumerador para poder obtener todos los valores del
objeto en un bucle. La diferencia con los otros algoritmos de recorrido que hemos visto
anteriormente, es que al estar la coleccin Hashtable basada en una combinacin de
clave/valor, necesitamos un enumerador basado en el interfaz IDictionaryEnumerator,
especialmente adaptado para manipular arrays de este tipo.

Como habr comprobado el lector, un enumerador IDictionaryEnumerator proporciona la


informacin de la coleccin mediante las propiedades Key y Value, a diferencia de un
enumerador simple, basado en IEnumerator, en el que usamos la propiedad Current, para
extraer los datos. La clase Hashtable no sita los valores que se aaden al array en posiciones
consecutivas, por lo que al obtener los valores mediante un enumerador posiblemente no
aparecern en el mismo orden en el que los aadimos inicialmente. Dada la filosofa de
funcionamiento de este tipo de objetos, el orden en el que se graban los valores dentro del
array no debera ser un problema, ya que nosotros accedemos al array utilizando claves y no
ndices, como sucede en un array estndar.

Tcnica de Programacin Orientada a Objetos

366

Operaciones varias con colecciones Hashtable


Antes de obtener valores de un objeto Hashtable, podemos comprobar que la clave o valor que
necesitamos estn realmente en la coleccin, empleando respectivamente los mtodos
ContainsKey( ) y ContainsValue( ). Al primero le pasamos como parmetro la clave a buscar,
mientras que al segundo le pasamos el valor. Ambos mtodos devuelven un resultado de tipo
Boolean, que indica si la comprobacin tuvo o no xito.

Por otra parte, el mtodo Remove( ), elimina un elemento del objeto, pasndole como
parmetro la clave a borrar, mientras que el mtodo Clear( ), elimina el contenido completo de
la coleccin.

Sub Main()
' crear coleccin Hashtable y aadir valores
Dim htCliente As New Hashtable()
htCliente.Add("ID", 22)
htCliente.Add("Nombre", "Pedro")
htCliente.Add("Apellidos", "Naranjo")
htCliente.Add("Domicilio", "C/Rio Bravo, 25")
htCliente.Add("Edad", 35)
htCliente.Add("Credito", 250)
' comprobar la existencia de elementos por la clave
Dim sClave As String
Console.WriteLine("Introducir la clave a buscar")
sClave = Console.ReadLine()
If htCliente.ContainsKey(sClave) Then
Console.WriteLine("La clave {0} existe, su valor es: {1}", _
sClave, htCliente(sClave))
Else
Console.WriteLine("La clave {0} no existe", sClave)
End If
Console.WriteLine()
Tcnica de Programacin Orientada a Objetos

367

' comprobar la existencia de elementos por el valor


Dim oValor As Object
Console.WriteLine("Introducir el valor a buscar")
oValor = Console.ReadLine()
' antes de comprobar si existe el valor
' debemos hacer una conversin al tipo
' especfico de dato del contenido de
' la variable oValor
If IsNumeric(oValor) Then
oValor = CType(oValor, Integer)
Else
oValor = CType(oValor, String)
End If
' ahora comprobamos
If htCliente.ContainsValue(oValor) Then
Console.WriteLine("El valor {0} existe", oValor)
Else
Console.WriteLine("El valor {0} no existe", oValor)
End If
' para borrar un elemento se usa la clave
htCliente.Remove("Nombre")
Console.WriteLine()
RecorrerHT(htCliente)
' ahora borramos el contenido al completo del objeto
htCliente.Clear()
Console.ReadLine()
End Sub

Tcnica de Programacin Orientada a Objetos

368

Public Sub RecorrerHT(ByVal htTabla As Hashtable)


Dim oEnumerador As IDictionaryEnumerator
oEnumerador = htTabla.GetEnumerator()
While oEnumerador.MoveNext()
Console.WriteLine("Clave: {0} / Valor: {1}", _
oEnumerador.Key, oEnumerador.Value)
End While
End Sub

Las propiedades Keys y Values de la clase Hashtable, devuelven un array con los nombres de
las claves y los valores de un objeto Hashtable respectivamente. Realmente devuelven un
objeto del interfaz ICollection, pero ya que un array implementa este interfaz, dicho objeto
podemos manipularlo como un array.

Observar que el modo de declarar y obtener los objetos ICollection e IEnumerator, que en
definitiva, nos llevan al mismo resultado, demostrando as, la gran flexibilidad sintctica que la
especificacin CLS proporciona al lenguaje.

Sub Main()
' crear y llenar la coleccin
Dim htCliente As New Hashtable()
htCliente.Add("ID", 22)
htCliente.Add("Nombre", "Pedro")
htCliente.Add("Apellidos", "Naranjo")
htCliente.Add("Domicilio", "C/Rio Bravo, 25")
htCliente.Add("Edad", 35)
htCliente.Add("Credito", 250)
' obtener un array con las claves,
' y recorrer con un enumerador
Dim aClaves As ICollection
aClaves = htCliente.Keys
Tcnica de Programacin Orientada a Objetos

369

Dim oEnumerador As IEnumerator


oEnumerador = aClaves.GetEnumerator()
Console.WriteLine("Claves del objeto Hashtable")
RecorrerEnumerador(oEnumerador)
' obtener un array con los valores,
' y recorrer con un enumerador
Dim aValores As ICollection = htCliente.Values
Dim oEnumVal As IEnumerator = aValores.GetEnumerator()
Console.WriteLine("Valores del objeto Hashtable")
RecorrerEnumerador(oEnumVal)
Console.ReadLine()
End Sub

Public Sub RecorrerEnumerador(ByVal oEnumerador As IEnumerator)


While oEnumerador.MoveNext
Console.WriteLine(oEnumerador.Current)
End While
Console.WriteLine()
End Sub

Traspaso de elementos desde una coleccin Hashtable a un array


bsico
El mtodo CopyTo( ) de la clase Hashtable, se encarga de traspasar a un array
estndar un determinado nmero de elementos desde un objeto Hashtable. Como ya
sablemos, cada elemento de una coleccin de este tipo est formado realmente por
dos componentes, clave y valor; por ello, cabe preguntarse cmo se las ingenia esta
clase para poder traspasarlos a un array normal.

La respuesta es la siguiente: lo que realmente se traspasa al array normal no son


valores independientes, sino una estructura de tipo DictionaryEntry, cuyas propiedades
son precisamente Key y Value, es decir, la clave y valor del elemento de la coleccin.

Tcnica de Programacin Orientada a Objetos

370

El cdigo siguiente muestra un ejemplo, en el cual, despus de crear un objeto Hashtable con
sus correspondientes valores, creamos un array normal de tipo Object al que traspasamos los
elementos desde el Hashtable.

Sub Main()
' crear un array Hashtable
Dim htCliente As New Hashtable()
htCliente.Add("ID", 22)
htCliente.Add("Nombre", "Pedro")
htCliente.Add("Apellidos", "Naranjo")
htCliente.Add("Domicilio", "C/Rio Bravo, 25")
htCliente.Add("Edad", 35)
htCliente.Add("Credito", 250)
' crear un array estndar
Dim aDeposito(10) As Object
aDeposito(0) = "aaa"
aDeposito(1) = "bbb"
aDeposito(2) = "ccc"
aDeposito(3) = "ddd"
' volcar elementos del Hashtable al array estndar,
' comenzando a copiar desde una posicin determinada
' del array estndar
htCliente.CopyTo(aDeposito, 2)
' obtener algunos valores del objeto Hashtable
' que se han pasado al array normal
Dim oEntradaDicc As DictionaryEntry
Dim iContador As Integer
For iContador = 3 To 6
oEntradaDicc = aDeposito(iContador)

Tcnica de Programacin Orientada a Objetos

371

Console.WriteLine("Clave: {0} / Valor: {1}", _


oEntradaDicc.Key, oEntradaDicc.Value)
Next
Console.ReadLine()
End Sub

Como el array normal tena valores asignados previamente, algunos de ellos se pierden,
puesto que el mtodo CopyTo( ) no redimensiona el array normal. Tenga este hecho en cuenta
el lector, ya que el array destino deber tener el suficiente tamao cuando traspasamos valores
desde una coleccin de este tipo.

Tcnica de Programacin Orientada a Objetos

372

Aplicaciones
Este laboratorio pretende ensear como se trabajan con componentes en Visual Basic .NET,
primero se ver un laboratorio de cmo crear una librera de clases y luego veremos como
trabajar con herencia de clases..

Ejercicio 1: Creando y Usando una Librera de Clases


Se va a construr una librera que permita manejar el inventario de productos en almacen y
realizar un mantenimiento de estos. Para esto realizar los siguientes pasos:

Elegir un nuevo proyecto Visual Basic y una plantilla Class Library, seleccionar en
ubicacin la carpeta C:\VBNET\Labs y como nombre escribir Libreria_Clases.
Escribir Producto como nombre fsico y lgico de la clase:

Public Class Producto

End Class

Creando propiedades para la clase producto:

Private mvarCodigo As String


Private mvarNombre As String
Private mvarPrecio As Single
Private mvarStock As Integer

Public Property Codigo() As String


Get
Codigo = mvarCodigo
End Get
Set(ByVal Value As String)
mvarCodigo = Value

Tcnica de Programacin Orientada a Objetos

373

End Set
End Property

Public Property Nombre() As String


Get
Nombre = mvarNombre
End Get
Set(ByVal Value As String)
mvarNombre = Value
End Set
End Property

Public Property Precio() As Single


Get
Precio = mvarPrecio
End Get
Set(ByVal Value As Single)
mvarPrecio = Value
End Set
End Property

Public Property Stock() As Integer


Get
Stock = mvarStock
End Get
Set(ByVal Value As Integer)
mvarStock = Value

Tcnica de Programacin Orientada a Objetos

374

End Set
End Property

Creando mtodos para la clase producto:

Public Sub CrearProducto(ByVal vCodigo As String, ByVal vNombre


As String, ByVal vPrecio As Single, ByVal vStock As Integer)
mvarCodigo = vCodigo
mvarNombre = vNombre
mvarPrecio = vPrecio
mvarStock = vStock
End Sub

Public Sub ActualizarPrecio(ByVal vOperacionPrecio As Byte,


ByVal vTasa As Single)
If vOperacionPrecio = 1 Then
mvarPrecio = (1 + (vTasa / 100)) * mvarPrecio
ElseIf vOperacionPrecio = 2 Then
mvarPrecio = (1 - (vTasa / 100)) * mvarPrecio
End If
End Sub

Tcnica de Programacin Orientada a Objetos

375

Public Sub ActualizarStock(ByVal vOperacionStock As Byte,


ByVal vCantidad As Integer)
If vOperacionStock = 1 Then
mvarStock = mvarStock + vCantidad
ElseIf vOperacionStock = 2 Then
mvarStock = mvarStock - vCantidad
End If
End Sub

Luego, aadimos una aplicacin para Windows que permita realizar el mantenimiento
de productos usando la librera creada.
Del men File elegimos Add Project, y seleccionamos New Project. Elegimos una
Aplicacin para Windows y le damos el nombre de Prueba_Libreria_Clases.

Configuramos para que la aplicacin sea la que inicia, dando clic derecho al nombre en
la ventana del Solution Explorer y eligiendo Set as StartUp Project.
Diseamos un formulario llamado frmProducto que tenga un TabControl con 3
fichas, una de ingreso de productos, otra de actualizacin de precios y stock y otra de
consulta, diseadas tal como muestran las figuras de abajo:

Tcnica de Programacin Orientada a Objetos

376

Ficha Ingreso del formulario frmProducto

Ficha Actualizacion del formulario frmProducto

Tcnica de Programacin Orientada a Objetos

377

Ficha Consulta del formulario frmProducto

Despus de realizar el diseo y antes de escribir cdigo, para usar la librera primero
debemos hacer una referencia a sta.
Del men Project elegir Add Reference..., seleccionar la ficha Projects, elegir la
librera creada y clic en Select, luego OK.

Declarar e inicializar una variable objeto de tipo de la clase producto, tal como sigue:

Private objProducto As New Libreria_Clases.Producto()

Programando en el botn de crear producto:

Tcnica de Programacin Orientada a Objetos

378

Private Sub btnCrear_Click() Handles btnCrear.Click


objProducto.CrearProducto(txtCodigo_Ing.Text, _
txtNombre_Ing.Text, Convert.ToSingle(txtPrecio_Ing.Text), _
Convert.ToInt16(txtStock_Ing.Text))
txtCodigo_Ing.Clear()
txtNombre_Ing.Clear()
txtPrecio_Ing.Clear()
txtStock_Ing.Clear()
End Sub

Programando los botones de actualizar precio y stock del producto:

Private Sub btnActualizarPrecio_Click() Handles ...


If rbnPrecioAumento.Checked = True Then
objProducto.ActualizarPrecio(1,
Convert.ToSingle(txtTasa.Text))
ElseIf rbnPrecioDisminucion.Checked = True Then
objProducto.ActualizarPrecio(2,
Convert.ToSingle(txtTasa.Text))
End If
txtTasa.Clear()
End Sub

Tcnica de Programacin Orientada a Objetos

379

Private Sub btnStock_Click() Handles btnStock.Click


If rbnStockAumento.Checked = True Then
objProducto.ActualizarStock(1,
Convert.ToInt16(txtCantidad.Text))
ElseIf rbnStockDisminucion.Checked = True Then
objProducto.ActualizarStock(2,
Convert.ToInt16(txtCantidad.Text))
End If
txtCantidad.Clear()
End Sub

Finalmente, mostrando los datos del producto:

Private Sub btnMostrar_Click() Handles btnMostrar.Click


With objProducto
txtCodigo_Con.Text = .Codigo
txtNombre_Con.Text = .Nombre
txtPrecio_Con.Text = .Precio.ToString
txtStock_Con.Text = .Stock.ToString
End With
End Sub

Tcnica de Programacin Orientada a Objetos

380

Ejercicio 2: Trabajando con Herencia de Clases


En este laboratorio vamos a construr una librera de clases para un Instituto Superior
Tecnolgico que permita matricular a los alumnos en un cierto curso libre dictado por un cierto
profesor. Para lo cual realizamos los siguientes pasos:

Elegir un nuevo proyecto Visual Basic y una plantilla Class Library, seleccionar en
ubicacin la carpeta C:\VBNET\Labs y como nombre escribir Libreria_Herencia.
Crear la clase Persona, modificando el nombre de la clase Class1 por el de
Persona, tanto fsica como lgicamente; luego escribir cdigo para crear las
propiedades: nombre, fechanac, edad y direccion; y el mtodo crearpersona:

Public Class Persona


Private mvarNombre As String
Private mvarFechaNac As Date
Private mvarEdad As Byte
Private mvarDireccion As String

Property Nombre() As String


Get
Nombre = mvarNombre
End Get
Set(ByVal Value As String)
mvarNombre = Value
End Set
End Property

Property FechaNac() As Date


Get
FechaNac = mvarFechaNac
End Get

Tcnica de Programacin Orientada a Objetos

381

Set(ByVal Value As Date)


mvarFechaNac = Value
End Set
End Property

ReadOnly Property Edad() As Byte


Get
Edad = mvarEdad
End Get
End Property

Property Direccion() As String


Get
Direccion = mvarDireccion
End Get
Set(ByVal Value As String)
mvarDireccion = Value
End Set
End Property

Sub CrearPersona(ByVal vNombre As String, _


ByVal vFechaNac As Date, ByVal vDireccion As String)
mvarNombre = vNombre
mvarFechaNac = vFechaNac
mvarDireccion = vDireccion
mvarEdad = Convert.ToByte(Date.Today.Year-vFechaNac.Year)
End Sub
End Class

Tcnica de Programacin Orientada a Objetos

382

Crear la clase Alumno que hereda de Persona, para lo cual aadimos una clase al
componente; del men Project elegimos Add Class... y escribimos como nombre
Persona.vb y Open. Luego escribimos el siguiente cdigo:

Public Class Alumno


Inherits Persona
Private mvarCodigo As String
Private mvarEspecialidad As String

Property Codigo() As String


Get
Codigo = mvarCodigo
End Get
Set(ByVal Value As String)
mvarCodigo = Value
End Set
End Property

Property Especialidad() As String


Get
Especialidad = mvarEspecialidad
End Get
Set(ByVal Value As String)
mvarEspecialidad = Value
End Set
End Property

Sub CrearAlumno(ByVal vNombre As String, _


ByVal vFechaNac As Date, ByVal vDireccion As String, _
ByVal vCodigo As String, ByVal vEspecialidad As String)
Tcnica de Programacin Orientada a Objetos

383

CrearPersona(vNombre, vFechaNac, vDireccion)


mvarCodigo = vCodigo
mvarEspecialidad = vEspecialidad
End Sub
End Class

Crear la clase Profesor que tambin hereda de Persona, para lo cual aadimos una
clase al componente; del men Project elegimos Add Class... y escribimos como
nombre Profesor.vb y Open. Luego escribimos el siguiente cdigo:

Public Class Profesor


Inherits Persona
Private mvarCodigo As String
Private mvarTipo As String

Property Codigo() As String


Get
Codigo = mvarCodigo
End Get
Set
mvarCodigo = Value
End Set
End Property

Property Tipo() As String


Get
Tipo = mvarTipo
End Get
Set
mvarTipo = Value
End Set

Tcnica de Programacin Orientada a Objetos

384

End Property

Sub CrearProfesor(ByVal vNombre As String, _


ByVal vFechaNac As Date, ByVal vDireccion As String, _
ByVal vCodigo As String, ByVal vTipo As String)
CrearPersona(vNombre, vFechaNac, vDireccion)
mvarCodigo = vCodigo
mvarTipo = vTipo
End Sub
End Class

Finalmente, crear la clase Curso, para lo cual aadimos una clase al componente; del
men Project elegimos Add Class... y escribimos como nombre Curso.vb y Open.
Luego escribimos el siguiente cdigo:

Public Class Curso


Private mvarCodigo As String
Private mvarNombre As String
Private mvarTotalHoras As Byte
Private mvarCostoTotal As Single
Private mvarCostoHora As Single

Property Codigo() As String


Get
Codigo = mvarCodigo
End Get
Set(ByVal Value As String)
mvarCodigo = Value
End Set
End Property

Property Nombre() As String

Tcnica de Programacin Orientada a Objetos

385

Get
Nombre = mvarNombre
End Get
Set(ByVal Value As String)
mvarNombre = Value
End Set
End Property

Property TotalHoras() As Byte


Get
TotalHoras = mvarTotalHoras
End Get
Set(ByVal Value As Byte)
mvarTotalHoras = Value
End Set
End Property

Property CostoTotal() As Single


Get
CostoTotal = mvarCostoTotal
End Get
Set(ByVal Value As Single)
mvarCostoTotal = Value
End Set
End Property

ReadOnly Property CostoHora() As Single


Get
CostoHora = mvarCostoHora
End Get
End Property

Tcnica de Programacin Orientada a Objetos

386

Sub CrearCurso(ByVal vCodigo As String, _


ByVal vNombre As String, ByVal vTotalHoras As Byte, _
ByVal vCostoTotal As Single)
mvarCodigo = vCodigo
mvarNombre = vNombre
mvarTotalHoras = vTotalHoras
mvarCostoTotal = vCostoTotal
mvarCostoHora = mvarCostoTotal / mvarTotalHoras
End Sub
End Class

Para probar la librera de clase aadimos un proyecto a la solucin, del men File,
elegimos Add Project y luego New Project..., seleccionando una aplicacin para
Windows a la cual llamaremos Prueba_Libreria_Herencia.
La aplicacin tendr un formulario llamado frmMatricula con 3 fichas, donde se
realizarn el ingreso de datos del alumno, el curso y el profesor para la matrcula, tal
como se muestran en las figuras de abajo.

Ficha Alumno del formulario frmMatricula

Tcnica de Programacin Orientada a Objetos

387

Ficha Curso del formulario frmMatricula

Ficha Profesor del formulario frmMatricula

Lo primero que tenemos que hacer para probar la librera en la aplicacin es hacer una
referencia a esta, eligiendo del men Project, Add References..., seleccionar la ficha
Projects y elegir la librera, clic en Select y OK.

Para que la aplicacin Windows que vamos a crear sea la que se ejecute dar clic
derecho al nombre del proyecto en la ventana del Solution Explorer y elegir Set as
StartUp Project.

En las declaraciones generales definimos variables objetos para manipular datos del
alumno, curso y el profesor, as como una rutina que permita limpiar textos.

Private objAlumno As New Libreria_Herencia.Alumno()

Tcnica de Programacin Orientada a Objetos

388

Private objCurso As New Libreria_Herencia.Curso()


Private objProfesor As New Libreria_Herencia.Profesor()

Sub LimpiarTextos()
txtAlumno_Codigo.Clear()
txtAlumno_Nombre.Clear()
txtAlumno_FechaNac.Clear()
txtAlumno_Direccion.Clear()
txtAlumno_Edad.Clear()
txtAlumno_Especialidad.Clear()
txtCurso_Codigo.Clear()
txtCurso_Nombre.Clear()
txtCurso_TotalHoras.Clear()
txtCurso_CostoTotal.Clear()
txtCurso_CostoHora.Clear()
txtProfesor_Codigo.Clear()
txtProfesor_Nombre.Clear()
txtProfesor_FechaNac.Clear()
txtProfesor_Direccion.Clear()
txtProfesor_Edad.Clear()
txtProfesor_Tipo.Clear()
End Sub

Programamos el botn Matricular para que guarde los datos de los objetos creados
anteriormente.
Private Sub btnMatricular_Click() Handles btnMatricular.Click
objAlumno.CrearAlumno(txtAlumno_Nombre.Text, _
Convert.ToDateTime(txtAlumno_FechaNac.Text), _
txtAlumno_Direccion.Text, txtAlumno_Codigo.Text, _
txtAlumno_Especialidad.Text)
objCurso.CrearCurso(txtCurso_Codigo.Text, _

Tcnica de Programacin Orientada a Objetos

389

txtCurso_Nombre.Text, _
Convert.ToByte(txtCurso_TotalHoras.Text), _
Convert.ToSingle(txtCurso_CostoTotal.Text))
objProfesor.CrearProfesor(txtProfesor_Nombre.Text, _
Convert.ToDateTime(txtProfesor_FechaNac.Text), _
txtProfesor_Direccion.Text, _
txtProfesor_Codigo.Text, txtProfesor_Tipo.Text)
LimpiarTextos()
End Sub

Escribimos cdigo en el botn Consultar para mostrar los datos almacenados en los
objetos.
Private Sub btnConsultar_Click() Handles btnConsultar.Click
With objAlumno
txtAlumno_Codigo.Text = .Codigo
txtAlumno_Nombre.Text = .Nombre
txtAlumno_FechaNac.Text=Format(.FechaNac, "dd/MM/yyyy")
txtAlumno_Direccion.Text = .Direccion
txtAlumno_Edad.Text = .Edad.ToString
txtAlumno_Especialidad.Text = .Especialidad
End With
With objCurso
txtCurso_Codigo.Text = .Codigo
txtCurso_Nombre.Text = .Nombre
txtCurso_TotalHoras.Text = .TotalHoras.ToString
txtCurso_CostoTotal.Text = .CostoTotal.ToString
txtCurso_CostoHora.Text = .CostoHora.ToString
End With

With objProfesor

Tcnica de Programacin Orientada a Objetos

390

txtProfesor_Codigo.Text = .Codigo
txtProfesor_Nombre.Text = .Nombre
txtProfesor_FechaNac.Text=Format(.FechaNac, "dd/MM/yyyy")
txtProfesor_Direccion.Text = .Direccion
txtProfesor_Edad.Text = .Edad.ToString
txtProfesor_Tipo.Text = .Tipo
End With
End Sub

Finalmente, programamos el botn de Salir de la aplicacin.


Private Sub btnSalir_Click() Handles btnSalir.Click
Me.Close()
End Sub

Tcnica de Programacin Orientada a Objetos

391

Contenido.

Clases del File System (Sistema de Archivos)


o Clase FileSystemInfo
o Clase FileInfo
o Clase DirectoryInfo
o Clase DriveInfo
o Enumerando los Drives: uso de la enumeracin Drivetype
o Clase Path. Cambiando la extensin de un archivo.

Acceso al Sistema de Archivos


Empezaremos viendo las las clases elementales o ms usadas para manejar el sistema de
archivos desde .NET.

El espacio de nombres System.IO es el que contiene todas las clases relacionadas con los
ficheros y directorios, en ese mismo espacio de nombres estn las clases dedicada a los
streams de .NET, ya que al fin y al cabo, cuando tratamos con los ficheros, estaremos tratando
con una secuencia de caracteres o bytes, secuencia a la que accederemos con las clases
especializadas.

Aqu nos centraremos principalmente en la forma de acceder a esos ficheros, a copiarlos, a


comprobar si existen, etc., en definitiva: a manipularlos.

Las clases del espacio de nombres System.IO


Entre las clases que nos podemos encontrar en este espacio de nombres, tenemos clases que
podemos agrupar dependiendo de las tareas que podemos hacer con ellas en:

o
o

Las clases para manipular las unidades, directorios y ficheros


Las clases para crear streams

Tcnica de Programacin Orientada a Objetos

392

Las clases para leer o escribir en los streams

Veamos primero una relacin de esas clases y enumeraciones y despus veremos algunas de
ellas con ms detalle.

Clases para manipular unidades, directorios y ficheros

Entre las clases que nos permiten trabajar con los ficheros, directorios y las unidades de disco,
podemos destacar las siguientes:

Directory, proporciona mtodos estticos para crear, mover y enumerar los ficheros de
directorios y subdirectorios.

DirectoryInfo, al igual que la clase Directory, pero los mtodos son de instancia, dicha
instancia se crear a partir de un directorio determinado.

DriveInfo, proporciona mtodos de instancia para crear, mover y enumerar el


contenido de unidades.

File, proporciona mtodos estticos para crear, copiar, eliminar, mover y abrir ficheros,
adems de ayudar a la creacin de objetos FileStream.

FileInfo, igual que la clase File, pero los mtodos son de instancia, dicha instancia se
crear a partir de un fichero determinado.

Path, proporciona mtodos y propiedades para procesar cadenas relacionadas con los
directorios.

Tambin tenemos las siguientes enumeraciones:

FileAccess, define constantes para el tipo de acceso a los ficheros: lectura, escritura o
lectura/escritura.

FileAttributes, define constantes para el atributo de los ficheros y directorios: archivo,


oculto, solo lectura, etc.

FileMode, define las constantes que podemos usar para controlar como abrimos un
fichero.

FileShare, define las constantes para controlar el tipo de acceso que otros objetos
FileStream pueden tener al mismo fichero.

Tcnica de Programacin Orientada a Objetos

393

Clases para manipular unidades, directorios y ficheros

Entre las clases que nos permiten trabajar con los ficheros, directorios y las unidades de disco,
podemos destacar las siguientes:

Directory, proporciona mtodos estticos para crear, mover y enumerar los ficheros de
directorios y subdirectorios.

DirectoryInfo, al igual que la clase Directory, pero los mtodos son de instancia, dicha
instancia se crear a partir de un directorio determinado.

DriveInfo, proporciona mtodos de instancia para crear, mover y enumerar el


contenido de unidades.

File, proporciona mtodos estticos para crear, copiar, eliminar, mover y abrir ficheros,
adems de ayudar a la creacin de objetos FileStream.

FileInfo, igual que la clase File, pero los mtodos son de instancia, dicha instancia se
crear a partir de un fichero determinado.

Path, proporciona mtodos y propiedades para procesar cadenas relacionadas con los
directorios.

Tambin tenemos las siguientes enumeraciones:

FileAccess, define constantes para el tipo de acceso a los ficheros: lectura, escritura o
lectura/escritura.

FileAttributes, define constantes para el atributo de los ficheros y directorios: archivo,


oculto, solo lectura, etc.

FileMode, define las constantes que podemos usar para controlar como abrimos un
fichero.

FileShare, define las constantes para controlar el tipo de acceso que otros objetos
FileStream pueden tener al mismo fichero.

Las clases Directory y DirectoryInfo

Tcnica de Programacin Orientada a Objetos

394

Cuando necesitemos acceder a un directorio, por ejemplo, para saber que subdirectorios y
ficheros contiene o para obtener otro tipo de informacin, incluso para saber si existe o no, en
esos casos podemos utilizar las clases Directory o DirectoryInfo.

La primera de ellas: Directory, proporciona mtodos estticos, es decir, los mtodos que
contienen siempre estarn disponibles sin necesidad de crear una nueva instancia de la clase.
Por tanto, podremos usar esos mtodos simplemente usando la propia clase.

La segunda: DirectoryInfo, proporciona los mismos mtodos que Directory, pero en lugar de
ser mtodos estticos, son mtodos de instancia, es decir, esos mtodos solamente se podrn
usar despus de haber creado una instancia (u objeto en memoria) de esta clase.

Cada una de las instancias de DirectoryInfo, har referencia a un directorio en particular, ese
directorio se indicar al crear el objeto, aunque tambin puede ser que est referenciado al
obtenerlo mediante otros mtodos que devuelven este tipo de objetos.

Nota:
El directorio asignado al crear la instancia de DirectoryInfo no tiene porqu existir.
De esa forma podemos comprobar si existe, y en caso de que no exista, crearlo, etc.

Por ejemplo, si queremos saber si un directorio existe, utilizaremos el mtodo Exists, en el caso
de la clase Directory, como parmetro le indicaremos el directorio del que queremos comprobar
su existencia, sin embargo, si usamos un objeto del tipo DirectoryInfo, no necesitamos indicar
ningn parmetro, ya que el directorio que est asociado con esa clase lo habremos indicado al
crear el objeto.

En el siguiente cdigo vemos cmo usar estas dos clases:

Const dir1 As String = "E:\Pruebas"


Const dir2 As String = "E:\Pruebas2"
Sub Main()
claseDirectory()
Console.WriteLine()
claseDirectoryInfo()
Console.WriteLine()
'
Console.ReadLine()
End Sub
Sub claseDirectory()
' Los mtodos de la clase Directory son estticos,
' por tanto no necesitamos crear una instancia de esta clase
'
' Comprobar si existe un directorio:
If System.IO.Directory.Exists(dir1) Then

Tcnica de Programacin Orientada a Objetos

395

Console.WriteLine("El directorio '{0}' SI existe", dir1)


Else
Console.WriteLine("El directorio '{0}' NO existe", dir1)
End If
End Sub
Sub claseDirectoryInfo()
' Los mtodos de la clase DirectoryInfo son de instancia,
' por tanto tenemos que crear una instancia de la clase
' para poder usarla
'
Dim di As New System.IO.DirectoryInfo(dir2)
'
' Comprobar si existe un directorio:
If di.Exists Then
Console.WriteLine("El directorio '{0}' SI existe", dir2)
Else
Console.WriteLine("El directorio '{0}' NO existe", dir2)
End If
End Sub

El resto de mtodos de estas dos clases funcionan de forma similar, al menos en el sentido de
que si usamos la clase Directory, siempre habr un parmetro que haga referencia al directorio
que queremos usar, mientras que con DirectoryInfo siempre estar haciendo referencia al
directorio usado al crear la instancia.

Nota:
No queremos parecer repetitivos, pero nos interesa que quede claro como funcionan este tipo
de clases, que por otro lado, ser similar al de las clases File y FileInfo, al menos en el sentido
de que la clase con los mtodos estticos siempre necesitar saber a que elemento del
sistema de archivos estamos refirindonos, mientras que las clases que debemos instanciar,
siempre sabrn con que elemento trabajarn.

Los mtodos de las clases Directory y DirectoryInfo

Estas clases siempre manejarn directorios y entre los mtodos que podemos utilizar,
destacamos los siguientes, empezamos por la clase Directory:

CreateDirectory, crear los directorios indicados en el parmetro. Si algunos de los


directorios intermedios no existen, los crear.

Exists, comprueba si el directorio indicado existe.

GetCurrentDirectory, devuelve el directorio de trabajo de la aplicacin.

GetDirectories, devuelve un array de String con todos los subdirectorios del directorio
indicado. Se puede indicar un "pattern" de bsqueda y si queremos incluir los
subdirectorios que tenga el directorio indicado.

Tcnica de Programacin Orientada a Objetos

396

GetDirectoryRoot, devuelve el directorio raz del directorio indicado.

GetFiles, devuelve un array de tipo String con los ficheros del directorio indicado. Se
puede indicar un filtro de bsqueda.

GetLogicalDrives, devuelve un array con los nombres de las unidades lgicas en el


formato: "<letra>:\".

Como hemos comentado, la clase DirectoryInfo siempre har referencia al directorio utilizado
para instanciarla, por tanto algunos de los mtodos de la clase Directory se convierten en
propiedades de esta clase y otros cambian de nombre para adecuarlos mejor a la accin a
realizar con ellos.

Por ejemplo, en la clase Directory tenemos el mtodo Exists, que en DirectoryInfo es una
propiedad. De igual forma, el mtodo Move de la clase Directory es el mtodo MoveTo de
DirectoryInfo.

En cuanto a los mtodos de Directory para obtener o asignar la fecha de creacin, acceso, etc.,
en DirectoryInfo son propiedades de lectura/escritura.

Dicho esto, no vamos a relacionar todos estos miembros de DirectoryInfo, ya que en la


documentacin estn bien detallados y no nos resultar difcil de saber cmo usarlos.

Lo que si queremos resaltar es que algunos de los mtodos de la clase DirectoryInfo,


concretamente GetDirectories y GetFiles, no devuelven un array de tipo String, sino un array de
objetos DirectoryInfo o FileInfo respectivamente.

Tambin debemos indicar que la clase DirectoryInfo tiene ciertas propiedades, como FullName
o Name, que nos dan informacin del nombre de la ruta completa o del nombre del directorio.

Y como nota final sobre Directory y DirectoryInfo, aclarar que el "filtro" (o pattern) que podemos
usar para filtrar los directorios o ficheros obtenidos con GetDirectories o GetFiles solo pueden
tener un filtro o especificacin, queremos aclarar este punto, ya que en Visual Basic 6.0, si
indicbamos un filtro en los controles File o Directory, podamos indicar varios filtros separados
por punto y coma (;), en las clases de .NET esto no se puede hacer.

Para dejar claro estos puntos, veremos un ejemplo de cmo usar GetDirectories y GetFiles, con
estas dos clases.

Tcnica de Programacin Orientada a Objetos

397

Imports System
Imports System.IO
Module Module
Const dir1 As String = "E:\Pruebas"
Sub Main()
Console.WriteLine("Ejemplo de la clase Directory:")
claseDirectory()
Console.WriteLine()
Console.WriteLine("Ejemplo de la clase DirectoryInfo:")
claseDirectoryInfo()
Console.WriteLine()
'
Console.ReadLine()
End Sub
Sub claseDirectory()
' Recorrer los subdirectorios de un directorio
Dim dirs() As String
dirs = Directory.GetDirectories(dir1)
mostrarFicheros(dir1, "*.txt")
' recorrer los ficheros de cada uno de estos directorios
For Each dir As String In dirs
mostrarFicheros(dir, "*.txt")
Next
End Sub
Sub mostrarFicheros(ByVal dir As String, ByVal filtro As String)
Console.WriteLine("Los ficheros {0} del directorio: {1}", _
filtro, dir)
Dim fics() As String
fics = Directory.GetFiles(dir, filtro)
For Each fic As String In fics
Console.WriteLine(" Fichero: {0}", fic)
Next
End Sub
Sub claseDirectoryInfo()
Dim di As New DirectoryInfo(dir1)
Dim dirs() As DirectoryInfo
dirs = di.GetDirectories
mostrarFicheros(di, "*.*")
For Each dir As DirectoryInfo In dirs
mostrarFicheros(dir, "*.*")
Next
End Sub
Sub mostrarFicheros(ByVal dir As DirectoryInfo, ByVal filtro As String)
Console.WriteLine("Los ficheros {0} del directorio: {1}", _
filtro, dir.FullName)
Dim fics() As FileInfo
fics = dir.GetFiles(filtro)
For Each fic As FileInfo In fics
Console.WriteLine(" Fichero: {0}", fic.Name)
Next
End Sub
End Module

Las clases File y FileInfo

Tcnica de Programacin Orientada a Objetos

398

Al igual que ocurre con las clases para manejar los directorios, tenemos dos clases diferentes
para manejar los ficheros, una de ellas (File) todos los mtodos que tiene son estticos, por
tanto podemos usarlos directamente, sin crear una nueva instancia de la clase. Por otro lado la
clase FileInfo es una clase de la que tenemos que crear un nuevo objeto para poder usarla, al
crear ese objeto (o instancia), tenemos que indicar el fichero al que har referencia, ese fichero
no tiene porqu existir previamente.

En el siguiente cdigo podemos ver cmo usar estas dos clases.

Imports System
Imports System.IO
Module Module1
Const fic1 As String = "E:\Pruebas\Prueba.txt"
Const fic2 As String = "E:\Pruebas\SubDir\Prueba3.txt"
Sub Main()
Console.WriteLine("Ejemplo de la clase File:")
claseFile()
Console.WriteLine()
Console.WriteLine("Ejemplo de la clase FileInfo:")
claseFileInfo()
Console.WriteLine()
'
Console.ReadLine()
End Sub
Sub claseFile()
' comprobar si el fichero existe
If File.Exists(fic1) Then
Console.WriteLine("El fichero '{0}' SI existe", fic1)
Console.WriteLine("Fecha creacin: {0}", File.GetCreationTime(fic1))
Else
Console.WriteLine("El fichero '{0}' NO existe", fic1)
End If
End Sub
Sub claseFileInfo()
Dim fi As New FileInfo(fic2)
'
' Comprobar si existe el fichero:
If fi.Exists Then
Console.WriteLine("El fichero '{0}' SI existe", fic2)
Console.WriteLine("Fecha creacin: {0}", fi.CreationTime)
agregarTexto(fi)
Else
Console.WriteLine("El fichero '{0}' NO existe", fic2)
' lo creamos
fi.Create()
End If
End Sub
Sub agregarTexto(ByVal fi As FileInfo)
Dim fs As StreamWriter
fs = fi.CreateText
fs.WriteLine("Hola, Mundo")
fs.Flush()
fs.Close()
'
fi.Refresh()

Tcnica de Programacin Orientada a Objetos

399

Console.WriteLine("Tamao : {0}", fi.Length)


End Sub
End Module

Cifrar y descifrar un fichero usando File o FileInfo


En los sistemas operativos Windows XP y Windows 2003, al mostrar el cuadro de dilogo de
las propiedades avanzadas de un fichero, nos permite cifrarlo, de forma que el usuario actual
slo tenga acceso al contenido del mismo.

Tanto la clase File como FileInfo tienen mtodos para realizar esta operacin, as como la
inversa: descifrarlo. Cuando ciframos un fichero, solo el usuario actual podr acceder a su
contenido (y el resto de administradores), la forma de hacerlo es bien simple: solo tenemos que
llamar al mtodo Encrypt o Decrypt para cifrarlo o descifrarlo. Cuando est cifrado, el nombre
del fichero se mostrar en un color diferente al del resto de ficheros (de forma predeterminada
en verde).

Esta forma de cifrado es diferente a la que vimos en la leccin anterior, ya que si ciframos el
contenido de un fichero de forma "manual", siempre estar cifrado, independientemente de
quin acceda al fichero.

Cuando utilizamos los mtodos para cifrar o descifrar un fichero, no recibiremos ninguna
excepcin si aplicamos el mtodo de cifrar sobre un fichero ya cifrado. Pero si queremos saber
si un determinado fichero est o no cifrado, lo podemos averiguar mediante la propiedad
Attribute de la clase FileInfo, particularmente comprobando si tiene activado el atributo
FileAttributes.Encrypted.

Tcnica de Programacin Orientada a Objetos

400

En el siguiente cdigo tenemos ejemplos de cmo usar las clases File y FileInfo para
comprobar si un fichero ya est cifrado, en cuyo caso lo desciframos, y si resulta que no est
cifrado, lo ciframos.

Imports System
Imports System.IO
Module Module1
Const fic1 As String = "E:\Pruebas\Prueba.txt"
Sub Main()
cifradoFile(fic1)
Console.WriteLine()
cifradoFileInfo(fic2)
Console.WriteLine()
'
Console.ReadLine()
End Sub
' Cifrar / Descifrar ficheros
' y comprobar si ya estn cifrados...
Sub cifradoFile(ByVal fichero As String)
' comprobar si est cifrado,
Dim atrib As FileAttributes
atrib = File.GetAttributes(fichero)
If (atrib And FileAttributes.Encrypted) = FileAttributes.Encrypted Then
Console.WriteLine("El fichero {0} ya estaba cifrado.", fichero)
File.Decrypt(fichero)
Else
File.Encrypt(fichero)
Console.WriteLine("El fichero {0} no estaba cifrado.", fichero)
End If
End Sub
Sub cifradoFileInfo(ByVal fichero As String)
' comprobar si est cifrado,
Dim fi As New FileInfo(fichero)
Dim atrib As FileAttributes
atrib = fi.Attributes
If (atrib And FileAttributes.Encrypted) = FileAttributes.Encrypted Then
Console.WriteLine("El fichero {0} ya estaba cifrado.", fi.FullName)
fi.Decrypt()
Else
fi.Encrypt()
Console.WriteLine("El fichero {0} no estaba cifrado.", fi.FullName)
End If
End Sub
End Module

Abrir ficheros para agregar o leer el contenido


Estas dos clases de manipulacin de ficheros exponen una serie de mtodos que nos permiten
abrir el fichero al que hace referencia la clase para leer el contenido del mismo o para escribir
en l. Dependiendo del mtodo usado, ste devolver un objeto de tipo FileStream o
StreamReader o StreamWriter. Esto nos permite de una forma fcil poder acceder al contenido
que tiene sin necesidad de usar otros constructores. Lo que si debemos tener en cuenta es que
en el caso de que leamos o escribamos texto, ste se guardar usando la codificacin UTF-8,
por tanto si queremos usar otro tipo de codificacin, tendremos que abrirlos usando los
constructores correspondientes, normalmente los de las clases StreamReader y StreamWriter.
De estas dos clases nos ocuparemos ms adelante.

Tcnica de Programacin Orientada a Objetos

401

Veamos un par de ejemplos que nos permitan leer el contenido o agregar nuevo texto a los
ficheros.

Imports System
Imports System.IO
Module Module1
Const fic3 As String = "E:\Pruebas\Prueba4.txt"
Const fic4 As String = "E:\Pruebas\SubDir\Prueba4.txt"
Sub Main()
abrirFile(fic3)
Console.WriteLine()
abrirFileInfo(fic4)
Console.WriteLine()
'
Console.ReadLine()
End Sub
' Abrir ficheros para leer el contenido o escribir en l
Sub abrirFile(ByVal fichero As String)
If File.Exists(fichero) Then
Dim fs As FileStream = File.OpenRead(fichero)
Dim enc As New System.Text.UTF8Encoding()
Dim datos(1024) As Byte
fs.Read(datos, 0, datos.Length)
fs.Close()
Dim s As String = enc.GetString(datos, 0, datos.Length)
Console.WriteLine("El contenido de: {0}{2} es:{2}{1}", _
fichero, s, vbCrLf)
Else
Console.WriteLine("Guardando algo en el fichero {0}", fichero)
Dim fs As FileStream = File.OpenWrite(fichero)
Dim enc As New System.Text.UTF8Encoding()
Dim datos() As Byte = enc.GetBytes("Hola bytes!")
fs.Write(datos, 0, datos.Length)
fs.Close()
End If
End Sub
Sub abrirFileInfo(ByVal fichero As String)
Dim fi As New FileInfo(fichero)
If fi.Exists Then
' abrir el fichero como texto y leemos el contenido
Dim sr As StreamReader = fi.OpenText
Dim s As String = sr.ReadToEnd
Console.WriteLine("El contenido de: {0}{2} es:{2}{1}", _
fichero, s, vbCrLf)
Else
Console.WriteLine("Guardando algo en el fichero {0}", fichero)
Dim sw As New StreamWriter(fi.OpenWrite)
sw.WriteLine("Hello bytes!")
sw.Close()
End If
End Sub
End Module

En el mtodo abrirFile utilizamos la clase File para abrir, leer y escribir en un fichero. En este
caso estamos usando un objeto del tipo FileStream para acceder al contenido de dicho fichero,

Tcnica de Programacin Orientada a Objetos

402

como sabemos, esta clase solo trabaja con bytes, por tanto si queremos leer el contenido del
mismo, debemos hacerlo mediante un array de bytes y para mostrar en formato texto ese
contenido, tenemos que aplicarle la codificacin correspondiente para extraer el contenido en
forma de una cadena. Lo mismo hacemos para guardar una cadena en el fichero, (en caso de
que no exista previamente).

En el mtodo abrirFileInfo, en lugar de crear un objeto FileStream para acceder al contenido,


usamos uno del tipo StreamReader, ya que esta clase si que nos devolver una cadena sin
necesidad de hacer conversiones extras. Lo mismo ocurre a la hora de escribir algo en el
fichero, aunque en esta ocasin utilizamos un objeto del tipo StreamWriter.

En el primer caso, cuando leemos el contenido, utilizamos el mtodo OpenText, el cual


devuelve un objeto del tipo StreamReader. Por otra parte, cuando queremos guardar texto, lo
que hacemos es pasarle al constructor de la clase StreamWriter el objeto FileStream devuelto
por el mtodo OpenWrite.

Nota:
Como hemos podido comprobar, cuando tratamos con las clases DirectoryInfo o
FileInfo, siempre estamos tratando con instancias que pueden ser diferentes y por tanto
mltiples, esas instancias siempre manejan el directorio o fichero usado en el
constructor, por tanto, ser preferible usar estas clases cuando tengamos que hacer
varias operaciones sobre el mismo directorio o fichero.

Por otro lado, si solo queremos hacer pocas operaciones, podemos usar las clases Directory o
File, ya que no necesitaremos crear un objeto en memoria para hacer las tareas que
necesitemos hacer.

Manipular cadenas relacionadas con ficheros y directorios usando Path


La clase Path es una clase especial, en la que todos los mtodos son estticos, por tanto para
usarla no necesitamos crear una instancia. Lo de "especial" es porque esta clase realmente no
realiza ninguna accin "fsica" sobre los directorios (o ficheros), simplemente nos permite
manipular los nombres de esos directorios o ficheros.

Por ejemplo, podemos usar esta clase para obtener informacin sobre un fichero, como el
nombre completo, el nombre del directorio o la extensin.

En el siguiente cdigo vemos cmo usar algunos de esos mtodos:

Tcnica de Programacin Orientada a Objetos

403

Const fic1 As String = "E:\Pruebas\Prueba.txt"


Sub clasePath()
Console.WriteLine("Nombre completo: {0}", fic1)
Console.WriteLine("El nombre: {0}", Path.GetFileName(fic1))
Console.WriteLine("Sin extensin: {0}", Path.GetFileNameWithoutExtension(fic1))
Console.WriteLine("La extensin: {0}", Path.GetExtension(fic1))
Console.WriteLine("El directorio: {0}", Path.GetDirectoryName(fic1))
End Sub

Nota:
Debido a que la clase Path solo maneja cadenas, podemos usar los mtodos de esta
clase con nombres de ficheros o directorios que no existen, y por tanto, cualquier
cambio que hagamos en esos parmetros, no afectarn a ningn fichero ni directorio.

Debido a que los ensamblados de .NET podemos usarlos con diferentes sistemas operativos
(al menos en teora), esta clase proporciona ciertas propiedades que nos permiten averiguar
los caracteres especiales de cada sistema, por ejemplo para saber el separador usado por los
directorios.

Con esta clase tambin podemos crear ficheros con nombres temporales, de forma que nos
aseguremos de que no habr otro fichero "temporal" con el mismo nombre. Igualmente, por
medio del mtodo GetTempPath podemos averiguar el directorio temporal del sistema.
Incluso podemos generar nombres aleatorios "seguros" para ficheros o directorios mediante el
mtodo GetRandomFileName.

Veamos un ejemplo para generar estos nombres temporales y aleatorios:

Dim dir As String


dir = Path.GetTempPath()
Console.WriteLine("Directorio temporal: {0}", dir)
Dim fic As String
fic = Path.GetTempFileName()
Console.WriteLine("Fichero temporal: {0}", fic)
'
fic = Path.GetRandomFileName()
Console.WriteLine("Fichero random: {0}", fic)

En los dos primeros casos, se usa el directorio %TEMP% del sistema. Y en el caso del fichero
temporal, la extensin es .tmp

En el nombre aleatorio, tanto el nombre como la extensin estn formados por caracteres
"imprimibles" aleatorios.

Tcnica de Programacin Orientada a Objetos

404

Esta sera una "posible" salida para un usuario llamado Alguien:

Directorio temporal: C:\Documents and Settings\Alguien\Local Settings\Temp\


Fichero temporal: C:\Documents and Settings\Alguien\Local
Settings\Temp\tmp257.tmp
Fichero random: rmbpgxv1.14g

Codigo fuente de algunas aplicaciones

1- Copiar archivos en un directorio

2- Crear un archivo vaco ( mtodo Create - objeto System.IO.File )

3- Crear un archivo plano y aadirle texto (mtodo WriteLine del objeto StreamWriter.
Espacio de nombres System.IO )

Tcnica de Programacin Orientada a Objetos

405

4- My.Computer.FileSystem.GetFiles - Listar archivos. Ejemplo que carga los elementos


en un ListBox.

5- My.Computer.FileSystem.FindInFiles - Buscar dentro de un fichero. Ejemplo que busca


en un directorio archivos que contengan una cadena de texto determinada. Incluir un
listbox en el formulario.

Tcnica de Programacin Orientada a Objetos

406

6- Comprobar si un directorio o archivo Existe. Propiedad Exist del objeto Directory y el


objeto File. (Espacio de nombres System.IO)

7- Renombrar un archivo. ( My.Computer.FileSystem.RenameFile )

8- Mover. ( My.Computer.FileSystem.MoveFile )

Tcnica de Programacin Orientada a Objetos

407

9- Eliminar archivos y carpetas. ( My.Computer.FileSystem.DeleteFile


My.Computer.FileSystem.DeleteDirectory )

Tcnica de Programacin Orientada a Objetos

).

408

10- Crear un archivo temporal. ( My.Computer.FileSystem.GetTempFileName )

11- Leer todo el contenido de un archivo de texto en una solo operacin, y almacenarlo en
una variable. ( My.Computer.FileSystem.ReadAllText )

12- Cargar directorios y archivos en un ListBox ( Mtodos GetFiles y GetDirectories)


Colocar en un formulario dos controles ListBox

Tcnica de Programacin Orientada a Objetos

409

13- Obtener propiedades. Ejemplo que usa la clase FileInfo de system.IO para obtener
algunas propiedades y datos de archivos ( el nombre , la fecha y la hora de
modificacin en formato corto , el tamao en bytes y la extensin )
Colocar un control Listview, un button y un control TextBox

Tcnica de Programacin Orientada a Objetos

410

Tcnica de Programacin Orientada a Objetos

411

Contenido.

Streams de Datos y de Archivos


o Comprendiendo los Streams.
o Clases que facilitan la lectura y escitura de datos
o La Clase File
o La Clase Directory
o Accediendo a un archivo: uso de la enumeracin FileAccess.
o Creacin de archivos usando la enumeracin FileMode.
o Manejo de Clases: Stream, FileStream, MemoryStream. Uso del Writer
y Reader

Streams de Datos y de Archivos


Al empezar a trabajar con .NET, uno de los "grandes" cambios que notaremos los que estamos
habituados a desarrollar con otros lenguajes es todo lo relacionado con el acceso al contenido
de los ficheros.
En .NET, y por tanto en Visual Basic 2005, el acceso a ficheros se realiza por medio de los
streams (o usando la traduccin de la documentacin: las secuencias).
Con los streams no solo podemos acceder a los ficheros de disco, sino que tambin podemos
acceder a otros tipos de "secuencias" o flujos de datos, desde streams de memoria a streams
para enviar informacin a travs de Internet.
Toda esta transmisin o flujo de informacin se realiza mediante una serie de mtodos de
lectura y escritura que estn bsicamente encapsulados en la clase abstracta Stream.
Esta clase ser la clase base de todas aquellas que de alguna forman tienen que transmitir
cierta informacin entre la fuente de datos y nuestra aplicacin.
En este captulo trataremos de las clases basadas en Stream que con ms frecuencia
utilizaremos, sobre todo en lo relacionado con el acceso a ficheros, que es al fin y al cabo la
utilidad principal de este tipo de "secuencias".

Tcnica de Programacin Orientada a Objetos

412

Streams en .NET
Segn hemos comentado en la introduccin, los streams (o secuencias o flujos) nos permiten
abstraernos de la forma en que estn implementados los procesos de acceso a los ficheros u
otros recursos. Todas las clases que manejan este tipo de flujos de datos estn basadas
(directa o indirectamente) en la clase Stream, la cual nos ofrece ciertos mtodos que nos
permiten, entre otras cosas, leer y escribir en esos flujos de informacin.
Adems de poder leer o escribir, tambin podemos realizar bsquedas o, dicho de otro modo,
podemos movernos a travs de esa secuencia de datos. Pero debido a que no todos los flujos
de datos nos permiten realizar todas las operaciones de la clase Stream, existen ciertas
propiedades por medio de las cuales podemos saber si se permiten todas las operaciones
"bsicas" que normalmente podremos hacer con los streams. Por ejemplo, es posible que no
podamos leer o escribir en una secuencia o que no podamos cambiar la posicin del "puntero"
de lectura o escritura. Para todas estas comprobaciones podremos usar las propiedades
CanRead, CanWrite o CanSeek, pero creo que antes de entrar en detalles, deberamos ver
algunos de las clases que .NET pone a nuestra disposicin para poder realizar este tipo de
operaciones con "las secuencias" de datos.

Las clases basadas en Stream

Entre las clases que estn basadas en esta clase abstracta tenemos las siguientes:
o

BufferedStream, clase abstracta que representa un buffer de almacenamiento para


operaciones de lectura y escritura de otro stream.

DeflateStream, permite la compresin y descompresin de streams usando el


algoritmo Deflat.

GZipStream, usada para comprimir y descomprimir streams.

FileStream, nos permite una forma bsica de acceder y manipular ficheros.

MemoryStream, crear un stream que se almacena en la memoria como una secuencia


de bytes.

NetworkStream, proporciona una secuencia de datos para el acceso a la red.

CryptoStream, un stream usado para encriptar otros streams.

Nota:
Las clases DeflateStream y GZipSteam estn incluidas en el espacio de nombres
System.IO.Compression.
La
clase
CryptoStream
est
incluida
en
el
espacio
de
nombres
System.Security.Cryptography.
La clase NetworkStream est incluida en el espacio de nombres System.Net.Sockets.

Tcnica de Programacin Orientada a Objetos

413

Adems de estas clases que se derivan directamente de la clase Stream, y que normalmente
se usan como "secuencias" a usar por otras clases de entrada/salida, tenemos otras que nos
permitirn acceder a esas secuencias de datos de una forma ms directa, (algunas de estas
las veremos con algo de ms detalle en el prximo captulo dedicado al sistema de archivos de
.NET), por ejemplo:
o

BinaryReader / BinaryWriter, lee o escribe tipos primitivos como valores binarios


utilizando una codificacin especfica.

StreamReader / StreamWriter, clases para leer y escribir caracteres en ficheros


utilizando una codificacin determinada.
StringReader / StringWriter, implementa TextReader o TextWriter para leer o escribir
en una cadena.

TextReader / TextWriter, clases abstractas para leer o escribir en una secuencia de


caracteres.

Cuando trabajamos con los streams debemos olvidarnos de las "cosas simples" y debemos
tener en cuenta que trataremos casi siempre con secuencias de bytes, ya que al fin y al cabo
esa es la forma de almacenar la informacin en los streams. Por tanto cuando veamos los
ejemplos que la documentacin de Visual Basic 2005 nos proporciona no debemos extraarnos
de que haya que hacer tantas "cosas" para acceder o manipular la informacin almacenada en
esas "secuencias" de datos. Si bien, esa "complicacin" nos da mayor control sorbe el formato
de la informacin contenida en los streams. Por suerte, para los que nos gustan las cosas
"simples" las clases especficas nos facilitan mucho las cosas.
A continuacin veremos un par de ejemplos en los que manipularemos cierta informacin tanto
en la memoria usando un objeto del tipo MemoryStream, como en un fichero de disco usando
FileStream y las clases que casi con seguridad usaremos habitualmente para acceder al
contenido de los ficheros: StreamReader y StreamWriter.
Manejar un fichero usando FileStream
En este primer ejemplo veremos lo complicado que pude parecer acceder a un fichero usando
la clase FileStream y por extensin cualquier mtodo de otras clases que devuelvan este tipo
de secuencia, como por ejemplo los mtodos OpenRead, OpenWrite, etc. de la clase File.
La "complejidad" de esta clase es que realmente obtiene o guarda la informacin por medio de
un array de tipo Byte, cuando a lo que estamos acostumbrados es a usar cadenas.
Nota:
Realmente, esta forma "binaria" de acceder a la informacin de un fichero no la tenemos
que ver como un inconveniente, ya que nos puede servir para acceder de forma "binaria"
a ese fichero, en caso de que nuestra intencin sea acceder de forma "normal" para, por
ejemplo, leer solo texto, deberamos usar otras clases ms especializadas para esa
tarea, como lo es StreamReader.

Tcnica de Programacin Orientada a Objetos

414

En el siguiente cdigo tenemos dos mtodos, uno que guarda una cadena en el fichero
indicado:

Private Sub guardarDatos(ByVal fichero As String, ByVal cadena As String)


' Abrimos o creamos el fichero, para escribir en l
Dim fs As New System.IO.FileStream(fichero, _
System.IO.FileMode.OpenOrCreate, _
System.IO.FileAccess.Write)
' Escribimos algunas cadenas,
' el problema es que solo podemos escribir arrays de bytes,
' por tanto debemos convertir la cadena en un array de bytes
Dim datos() As Byte
' pero usando la codificacin que creamos conveniente
' de forma predeterminada es UTF-8,
' aunque la codificacin de Windows es ANSI (Encoding.Default)
Dim enc As New System.Text.UTF8Encoding
' convertimos la cadena en un array de bytes
datos = enc.GetBytes(cadena)
' lo escribimos en el stream
fs.Write(datos, 0, datos.Length)
' nos aseguramos que se escriben todos los datos
fs.Flush()
' cerramos el stream
fs.Close()
End Sub

En el constructor de la clase FileStream indicamos el fichero en el que queremos guardar la


informacin, tambin le indicamos que queremos crearlo o abrirlo, es decir, si ya existe lo abre
y si no existe lo crea, de cualquiera de las formas, en el siguiente parmetro del constructor le
indicamos que nuestra intencin es escribir en ese fichero.

Como hemos comentado, la clase FileStream (y en general todos los streams) trabaja con
bytes, por tanto para poder almacenar algo en ese fichero debemos hacerlo mediante un array
de tipo Byte.

En el caso de las cadenas, stas siempre deben estar codificadas, es decir, deben usar el
juego de caracteres que creamos conveniente, en el mundo de .NET ese juego de caracteres
es Unicode, ms concretamente usando la codificacin UTF-8, la cual permite trabajar con
cualquier carcter de cualquier cultura.

Como lo que nos interesa es convertir una cadena en un array de bytes, usamos el mtodo
GetBytes de un objeto UTF8Encoding, el cual convierte la cadena en una "ristra" de bytes con
el formato adecuado, en este caso UTF-8.

Si en lugar de usar UTF-8 quisiramos usar otro "codificador", por ejemplo el predeterminado
de Windows, con idea de que los ficheros sean compatibles con otras aplicaciones que utilizan
el formato predeterminado de Windows, tendremos que declarar la variable enc de la siguiente
forma:

Tcnica de Programacin Orientada a Objetos

415

Dim enc As System.Text.Encoding = System.Text.Encoding.Default

A continuacin, simplemente le pasamos el array de bytes al mtodo Write del FileStream


indicando desde que posicin de dicho array debe escribir y cuantos bytes.
Por ltimo nos aseguramos de que todos los bytes del "buffer" se guarden en el fichero y lo
cerramos.

Y otra funcin que devuelve el contenido de un fichero en formato cadena:

Private Function leerDatos(ByVal fichero As String) As String


' Los bloques ledos los almacenaremos en un StringBuilder
Dim res As New System.Text.StringBuilder
' Abrimos el fichero para leer de l
Dim fs As New System.IO.FileStream(fichero, _
System.IO.FileMode.Open, _
System.IO.FileAccess.Read)
' los datos se leern en bloques de 1024 bytes (1 KB)
Dim datos(1024) As Byte
Dim enc As New System.Text.UTF8Encoding()
' leemos mientras hay algo en el fichero
While fs.Read(datos, 0, 1024) > 0
' agregamos al stringBuilder los bytes ledos
' (convertidos en una cadena)
res.Append(enc.GetString(datos))
End While
' cerramos el buffer
fs.Close()
' devolvemos todo lo ledo
Return res.ToString
End Function

En esta funcin vamos a leer los datos del fichero indicado, como ya hemos vistos, la clase
FileStream trabaja con bytes y esos bytes los convertimos a caracteres por medio de las clases
de codificacin especializadas.
Por regla general, esas lecturas las haremos de forma parcial, es decir leyendo bloques de
bytes y como tenemos que convertir esos bytes en caracteres, y puede ser que el fichero sea
muy grande, en lugar de concatenar una cadena para almacenar las lecturas parciales, vamos
a usar un objeto del tipo StringBuilder en el que iremos "agregando" cada trozo ledo, de forma
que el rendimiento no se vea penalizado por la forma de ser de las cadenas, ya que cada vez
que hacemos una concatenacin en una variable de tipo String, realmente estamos creando
nuevos objetos en la memoria y si son muchos, pues la verdad es que tendremos al recolector
de basura (GC) trabajando a tope, y si usamos un objeto StringBuilder el rendimiento mejora
una barbaridad.
La lectura de cada bloque de bytes lo hacemos en un bucle While, tambin podramos haberlo
hecho en un bucle Do While, pero en estos casos, el rendimiento de While es un "poquitn"
mayor.

Tcnica de Programacin Orientada a Objetos

416

Los datos ledos los agregamos al objeto StringBuilder por medio del mtodo Append que se
encarga de agregarlo a la cadena interna.
Finalmente cerramos el stream y devolvemos la cadena leda.
Para usar estas dos funciones lo podemos hacer de la siguiente forma:

' un fichero de ejemplo (el directorio debe existir)


Const fichero As String = "E:\Pruebas\prueba.txt"
' guardamos una cadena en el fichero
guardarDatos(fichero, "Hola, Mundo de FileStream")
'
' Leemos el contenido del fichero y lo mostramos
Console.WriteLine(leerDatos(fichero))

Este cdigo no necesita mayor explicacin.

Manejar un fichero usando StreamReader y StreamWriter

A continuacin veremos cmo crear las dos funciones del ejemplo anterior para que utilicen las
clases "especializadas" para leer y escribir cadenas en un fichero.

Como podremos comprobar, esta es una forma muchsimo ms simple y, por tanto
recomendada para este tipo de acceso a los ficheros. Aunque debemos recordar que solo
servir para leer la informacin de forma secuencial y en formato cadena.
La funcin para guardar una cadena en un fichero:
Private Sub guardarDatos(ByVal fichero As String, ByVal cadena As String)
' Abrimos el fichero para escribir, (no aadir),
' usando la codificacin predeterminada: UTF-8
Dim sw As New System.IO.StreamWriter(fichero, False)
' guardamos toda la cadena
sw.WriteLine(cadena)
' Cerramos el fichero
sw.Close()
End Sub

Como podemos apreciar, esta es una forma mucho ms "compacta" que la anterior, ya que
solo tenemos que indicar en el constructor lo que queremos hacer y usar el mtodo Write o
WriteLine para guardar lo que queramos en el fichero.
Para guardarlo usando la codificacin predeterminada del Sistema Operativo en el que se
utilice la aplicacin, (en Windows ser ANSI), simplemente usamos este constructor:
Dim sw As New System.IO.StreamWriter(fichero, False, System.Text.Encoding.Default)

Para leer los datos podemos hacerlo de dos formas: lnea a lnea o todo el contenido de una
sola vez.

Tcnica de Programacin Orientada a Objetos

417

En el cdigo siguiente se muestra lnea a lnea, y al final, (comentado), cmo hacerlo en una
sola pasada.
Private Function leerDatos(ByVal fichero As String) As String
' Abrimos el fichero para leer
' usando la codificacin UTF-8 (la predeterminada de .NET)
Dim sr As New System.IO.StreamReader(fichero, True)
' si queremos usar la predeterminada de Windows
'Dim sr As New System.IO.StreamReader(fichero, System.Text.Encoding.Default)
' Podemos leer cada una de las lneas del fichero o todo el contenido
' Forma larga:
' si vamos a leer el fichero lnea por lnea, mejor usar un StringBuilder
Dim ret As New System.Text.StringBuilder
' recorremos el fichero hasta que no haya nada que leer
While sr.Peek <> -1
ret.Append(sr.ReadLine)
End While
' cerramos el fichero
sr.Close()
' devolvemos lo ledo
Return ret.ToString
'
'' Forma corta:
'' leemos todo el contenido del fichero
'Dim ret As String = sr.ReadToEnd()
'' lo cerramos
'sr.Close()
'' devolvemos lo ledo
'Return ret
End Function

Si nos decidimos a leer el contenido del fichero lnea a lnea, podemos usar el mtodo Peek, el
cual devolver el siguiente carcter del buffer del stream, o -1 si no hay nada que leer. Peek no
"consume" el carcter, simplemente comprueba si hay algo que leer.
Si hay algo que leer, leemos la lnea completa y la aadimos al objeto StringBuilder, el bucle se
repetir mientras haya informacin pendiente de leer.
Pero si optamos por la va rpida, porque realmente no nos interese procesar cada lnea,
podemos usar el mtodo ReadToEnd, que en nuestro ejemplo, el valor devuelto ser todo el
contenido del fichero, el cual asignamos a una variable de tipo String para usarla como valor
devuelto por la funcin, despus de cerrar el fichero.

Asegurarnos que el fichero se cierra

Si queremos ahorrarnos el paso intermedio de asignar el valor en una variable y despus


devolverlo, tambin podemos hacerlo de esta forma:

Try
Return sr.ReadToEnd()
Finally
sr.Close()
End Try
Tcnica de Programacin Orientada a Objetos

418

Ya que el bloque Finally siempre se ejecutar, se produzca o no un error, por tanto nos
aseguramos de que el fichero se cierra.

Liberar recursos: Using... End Using

O si lo preferimos, podemos usar la nueva forma de asegurarnos de que los recursos usados
se liberan:

' Podemos usar Using para asegurarnos de que el recurso se libera


Private Function leerDatos(ByVal fichero As String) As String
Dim sr As New System.IO.StreamReader(fichero, True)
Using sr
Return sr.ReadToEnd()
End Using
End Function

En este cdigo, cuando usamos Using sr, al ejecutarse End Using, el CLR se encargar de
llamar al mtodo Dispose de la clase, de forma que se liberen los recursos que estemos
usando, en este ejemplo: el fichero abierto.
Estos dos ltimos ejemplos seran equivalentes a los anteriores, ms seguros, pero tambin
con ms "trabajo" para el CLR.
Nota:
Using... End Using solo se puede usar con clases que implementen la interfaz
IDisposable, que es la que asegura que el objeto implementa el mtodo Dispose.
Por tanto, si implementamos el mtodo IDisposable.Dispose en nuestras clases, en ese
mtodo nos tenemos que asegurar que liberamos los recursos que nuestra clase est
utilizando.

Ejemplo de para cifrar y descifrar un fichero


En el siguiente ejemplo (adaptado de uno de la documentacin), veremos cmo usar algunas
de las clases basadas en Stream, particularmente las clase MemoryStream, FileStream,
CryptoStream adems de las clases StreamReader y StreamWriter.
Este cdigo tiene dos funciones:
La
primera
encripta
(cifra)
una
cadena
y
la
guarda
en
un
La segunda desencripta (descifra) el contenido de un fichero y lo guarda en otro.

fichero.

Ambas funciones devuelven la cadena cifrada o descifrada respectivamente.


Imports System
Imports System.IO
Imports System.Text
Imports System.Security.Cryptography
Module Module1
Const fic1 As String = "E:\Pruebas\Prueba CryptoStream.txt"
Const fic3 As String = "E:\Pruebas\Prueba CryptoStream des.txt"
Const sKey As String = "El password a usar"
Sub Main()

Tcnica de Programacin Orientada a Objetos

419

Dim ret As String


'
ret = cifrarFichero("Hola, Mundo encriptado", fic1)
Console.WriteLine("Cadena encriptada : {0}", ret)
'
ret = descifrarFichero(fic1, fic3)
Console.WriteLine("Cadena desencriptada: {0}", ret)
'
Console.ReadLine()
End Sub
Function cifrarFichero( _
ByVal texto As String, _
ByVal ficSalida As String) As String
' Creamos un MemorySream con el texto a cifrar
Dim enc As New UTF8Encoding
Dim datos() As Byte = enc.GetBytes(texto)
Dim ms As New MemoryStream(datos)
' El fichero de salida
Dim fs As New FileStream(ficSalida, FileMode.Create, FileAccess.Write)
' El proveedor criptogrfico
Dim r As New DESCryptoServiceProvider
'Establecer la clave secreta
r.Key = Encoding.Default.GetBytes(sKey.Substring(0, 8))
r.IV = Encoding.Default.GetBytes(sKey.Substring(0, 8))
' Crear una secuencia de cifrado
Dim cs As New CryptoStream(fs, _
r.CreateEncryptor(), _
CryptoStreamMode.Write)
'Escribir el fichero cifrado
cs.Write(datos, 0, datos.Length)
cs.Close()
'devolver el texto cifrado
Return Convert.ToBase64String(ms.ToArray())
End Function
Function descifrarFichero( _
ByVal fichero As String, _
ByVal ficSalida As String) As String
' el proveedor del cifrado y las claves usadas para cifrar
Dim r As New DESCryptoServiceProvider
r.Key() = Encoding.Default.GetBytes(sKey.Substring(0, 8))
r.IV = Encoding.Default.GetBytes(sKey.Substring(0, 8))
' crear la secuencia para leer el fichero cifrado
Dim fs As New FileStream(fichero, FileMode.Open, FileAccess.Read)
Dim cs As New CryptoStream(fs, _
r.CreateDecryptor(), _
CryptoStreamMode.Read)
' guardar el contenido de fichero descifrado
Dim sw As New StreamWriter(ficSalida)
Dim sr As New StreamReader(cs)
sw.Write(sr.ReadToEnd)
sw.Flush()
sw.Close()
'
' devolver el texto
sr = New StreamReader(fic3)
Dim ret As String = sr.ReadToEnd()
sr.Close()
'
Return ret
End Function
End Module

Tcnica de Programacin Orientada a Objetos

420

Bibliografa
JOYANES AGUILAR, Luis. Fundamentos de Programacin, Estructura de
Datos y Programacin Orienta Objetos. 3era Edicin
McGrawHill/Interamericana de Espaa
Manuales Oficiales de Preparacin para los Exmenes de Certificacin
Microsoft Curso 2546: Core Windows Application Development with
Visual Studio 2005
MCTS Self-Paced Training Kit (Exam 70-536): Microsoft .NET Framework
2.0 Application Development Foundation
Programming Microsoft Visual Basic 2005: The Language

Tcnica de Programacin Orientada a Objetos

421

S-ar putea să vă placă și

  • 3 Sesion Primera Semana de BD - Oracle
    3 Sesion Primera Semana de BD - Oracle
    Document7 pagini
    3 Sesion Primera Semana de BD - Oracle
    Ricardo Coello Palomino
    Încă nu există evaluări
  • 2 Sesion Primera Semana de BD - Oracle
    2 Sesion Primera Semana de BD - Oracle
    Document6 pagini
    2 Sesion Primera Semana de BD - Oracle
    Ricardo Coello Palomino
    Încă nu există evaluări
  • 1 Sesion Primera Semana de BD - Oracle
    1 Sesion Primera Semana de BD - Oracle
    Document17 pagini
    1 Sesion Primera Semana de BD - Oracle
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 21 - LP I
    Sesion 21 - LP I
    Document6 pagini
    Sesion 21 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 20 - LP I
    Sesion 20 - LP I
    Document8 pagini
    Sesion 20 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 10 - LP I
    Sesion 10 - LP I
    Document3 pagini
    Sesion 10 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Semana 06
    Semana 06
    Document13 pagini
    Semana 06
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 20 - LP I
    Sesion 20 - LP I
    Document8 pagini
    Sesion 20 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Clase 02
    Clase 02
    Document13 pagini
    Clase 02
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Semana 01
    Semana 01
    Document34 pagini
    Semana 01
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 07 - LP I
    Sesion 07 - LP I
    Document2 pagini
    Sesion 07 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 12 - LP I
    Sesion 12 - LP I
    Document16 pagini
    Sesion 12 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 07 - LP I
    Sesion 07 - LP I
    Document2 pagini
    Sesion 07 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 10 - LP I
    Sesion 10 - LP I
    Document13 pagini
    Sesion 10 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Modelamiento de Si
    Modelamiento de Si
    Document2 pagini
    Modelamiento de Si
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Semana 02 Fundamentos de Programacion B
    Semana 02 Fundamentos de Programacion B
    Document9 pagini
    Semana 02 Fundamentos de Programacion B
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 11 - LP I
    Sesion 11 - LP I
    Document3 pagini
    Sesion 11 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 01 - LP I
    Sesion 01 - LP I
    Document11 pagini
    Sesion 01 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 01 - LP I
    Sesion 01 - LP I
    Document11 pagini
    Sesion 01 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 08 - LP I Java
    Sesion 08 - LP I Java
    Document6 pagini
    Sesion 08 - LP I Java
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 06 - LP I
    Sesion 06 - LP I
    Document2 pagini
    Sesion 06 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 09 - LP I Java
    Sesion 09 - LP I Java
    Document4 pagini
    Sesion 09 - LP I Java
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 05 - LP I
    Sesion 05 - LP I
    Document2 pagini
    Sesion 05 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 04 - LP I
    Sesion 04 - LP I
    Document1 pagină
    Sesion 04 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 03 - LP I Java
    Sesion 03 - LP I Java
    Document5 pagini
    Sesion 03 - LP I Java
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 07 - LP I
    Sesion 07 - LP I
    Document2 pagini
    Sesion 07 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 02 - LP I
    Sesion 02 - LP I
    Document10 pagini
    Sesion 02 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 06 - LP I
    Sesion 06 - LP I
    Document2 pagini
    Sesion 06 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Semana 01 Fundamentos de Programacion B
    Semana 01 Fundamentos de Programacion B
    Document31 pagini
    Semana 01 Fundamentos de Programacion B
    Ricardo Coello Palomino
    Încă nu există evaluări
  • Sesion 05 - LP I
    Sesion 05 - LP I
    Document2 pagini
    Sesion 05 - LP I
    Ricardo Coello Palomino
    Încă nu există evaluări