Sunteți pe pagina 1din 21

Docente: C.

Felipe Fernndez Pgina 1



Fundamentos de Lenguajes de Programacin
GUIA POO

Esta gua de estudio ha sido preparada para reforzar los conceptos que conforman
el paradigma de la Programacin Orientada a Objetos (POO) u (OOP por sus siglas en
Ingls) adem!s de presentar algunos ejemplos " ejercicios pr!cticos que ser#ir!n de
apo"o al estudiante durante el transcurso de este mdulo
El objeti#o principal es que el estudiante sea capaz de desarrollar la capacidad de
comprender el desarrollo de programas con $isual %asic&'et implementando soluciones
propuestas " resueltas& Esta gua ha sido confeccionada con contenidos e(trados de la
)eb&
*omenzaremos entonces con algunos conceptos "a #istos en clases+
.NET Framework
Est! basado en clases (u objetos) " a diferencia de las #ersiones anteriores de $isual
%asic la #ersin &'E, de este lenguaje basa su funcionamiento casi e(clusi#amente en las
clases contenidas en &'E, -rame.or/ adem!s casi sin ning0n tipo de limitaciones& 1ebido
a esta dependencia en las clases del &'E, -rame.or/ " sobre todo a la forma 2hereditaria2
de usarlas $isual %asic &'E, tena que ofrecer esta caracterstica sin ning0n tipo de
restricciones& Por suerte para nosotros esto es as&&& por tanto creo con#eniente que
#eamos el conte(to de la Programacin Orientada a Objetos&

Elementos de POO
3e define que cualquier lenguaje basado en objetos debe cumplir con estos tres
requisitos

+ !erencia" Enca#sulacin $o enca#sulamiento% & Polimor'ismo


$eamos qu es lo que significa cada uno de ellos+
a% !erencia
4a herencia es la cualidad de crear clases que estn basadas en otras clases& 4a nue#a
clase heredar! todas las propiedades " mtodos de la clase de la que est! deri#ada
adem!s de poder modificar el comportamiento de los procedimientos que ha heredado
as como a5adir otros nue#os

6racias a la herencia podemos ampliar cualquier clase e(istente adem!s de
apro#echarnos de todo lo que esa clase haga&


7
Algunos autores aaden un cuarto requisito: la abstraccin, pero este ltimo est
estrechamente ligado con la encapsulacin, ya que, de hecho, es prcticamente lo mismo,
cuando desarrollemos la parte prctica, lo comprobars y podrs decidir por tu cuenta si son tres
o cuatro los pilares de la POO.

Docente: C. Felipe Fernndez Pgina 2

Para que lo entiendas mejor, eamos un ejemplo clsico:

3upongamos que tenemos una clase 6ato que est! deri#ada de la clase 8nimal& El
6ato hereda de 8nimal todas las caractersticas comunes a los animales adem!s de
a5adirle algunas caractersticas particulares a su condicin felina&
Podemos decir que un 6ato es un 8nimal lo mismo que un Perro es un 8nimal
ambos est!n deri#ados (han heredado) de la clase 8nimal pero cada uno de ellos es
diferente aunque en el fondo los dos son animales& Esto es herencia+ usar una clase base
(8nimal) " poder ampliarla sin perder nada de lo heredado pudiendo ampliar la clase de la
que se ha deri#ado (o heredado)&

(% Enca#sulamiento
Es la capacidad de separar la implementacin de la interfaz de una clase del cdigo de
un sistema& Para que #a"amos entendiendo cuando digo+ la implementacin de la interfaz
de una clase me refiero a los miembros de esa clase+ mtodos propiedades e#entos etc&
Es decir lo que la clase es capaz de hacer&
*uando usamos las clases stas tienen una serie de caractersticas (los datos que
manipula) as como una serie de comportamientos (las acciones a realizar con esos datos)&
Pues la encapsulacin es esa capacidad de la clase de ocultarnos sus interioridades para
que slo #eamos lo que tenemos que #er sin tener que preocuparnos de cmo est!
codificada para que haga lo que hace&&& simplemente nos debe importar que lo hace&
3i tomamos el ejemplo de la clase 6ato sabemos que ara5a come se mue#e etc&
pero el cmo lo hace no es algo que deba preocuparnos sal#o que se lance sobre
nosotros&&& aunque en ese caso lo que deberamos tener es una clase 2espanta9gatos2
para quit!rnoslo de encima lo antes posible&&&

c% Polimor'ismo

Permite usar miembros de distintas clases de forma genrica sin tener que
preocuparnos si pertenece a una clase o a otra& Es decir siguiendo con el ejemplo de los
animales si el 6ato " el Perro pueden morder podramos tener un 2animal2 que muerda
sin importarnos que sea el 6ato o el Perro simplemente podramos usar el mtodo
:order "a que ambos animales tienen esa caracterstica 2animal mordedor2&

Las )lases
;a hemos #isto antes lo que son las clases en la teora& ;a que todo lo que tiene el
&'E, -rame.or/ en realidad son clases pero ahora en la pr!ctica #eremos que una
clase no es ni m!s ni menos que cdigo& 8unque dicho de esta forma cualquier programa
sera una clase&

Docente: C. Felipe Fernndez Pgina 3

*uando definimos una clase realmente estamos definiendo dos cosas diferentes+ los
datos que dicha clase puede manipular o contener es decir los atributos " la forma de
acceder a esos datos o las funcionalidades que posee es decir los mtodos&
Por ejemplo si tenemos una clase de tipo *liente por un lado tendremos los datos de
dicho cliente " por otro la forma de acceder o modificar esos datos& En el primer caso los
datos del *liente como por ejemplo el nombre domicilio etc& estar!n representados por
una serie de campos o propiedades mientras que la forma de modificar o acceder a esa
informacin del *liente se har! por medio de mtodos& Esas propiedades o caractersticas
" las acciones a realizar son las que definen a una clase&
Los O(jetos
Por un lado tenemos una clase que es la que define un 2algo2 con lo que podemos
trabajar& Pero para que ese 2algo2 no sea un 2nada2 tendremos que poder con#ertirlo en
2algo tangible2 es decir tendremos que tener la posibilidad de que e(ista& 8qu es
cuando entran en juego los objetos "a que un objeto es una clase que tiene informacin
real dicho de otra forma la *lase asigna a un Objeto las caractersticas propias "
particulares que lo identifican de los dem!s objetos&
1igamos que la clase es la 2plantilla2 a partir de la cual podemos crear un objeto en la
memoria&
Por ejemplo podemos tener #arios objetos del tipo *liente uno por cada cliente que
tengamos en nuestra cartera de clientes pero la clase slo ser! una& 1icho de otra forma+
podemos tener #arias instancias en memoria de una clase& <na instancia es un objeto (los
datos) creado a partir de una clase (la plantilla o el cdigo)&
Primero emoslo desde el punto de ista del !isual "tudio:
Agregar una clase a un #ro&ecto.
Para poder interiorizarnos en el tema de las clases primero debemos saber cmo
agregar una a nuestro pro"ecto teniendo en cuenta que la mejor practica es manejarlas
=fuera> de los formularios como un elemento independiente "a que esto nos da un mejor
control " administracin sobre ellas& %ueno #amos a #er como se genera una clase dentro
de un pro"ecto& 4o primero es hacer clic con el botn derecho sobre el icono del pro"ecto
en el =e(plorador de soluciones> luego poner el puntero sobre el #tem$ agregar$ y
desplegar el men conte%tual &nueo elemento$, como en la 'igura(.

Docente: C. Felipe Fernndez Pgina 4

)ig(.

*sto har que se despliegue un men ms o menos como este:
)ig.+

*n el campo nombre ingresa el nombre del archio que tendr tu clase.
Ahora, para entender mejor todo este &enredo$, desglosemos las clases:





Docente: C. Felipe Fernndez Pgina 5

Los miem(ros de una clase
4as clases contienen datos esos datos suelen estar contenidos en #ariables& 8 esas
#ariables cuando pertenecen a una clase se les llama+ campos o propiedades& Por
ejemplo el nombre de un cliente sera una propiedad de la clase *liente& Ese nombre lo
almacenaremos en una #ariable de tipo 3tring de dicha #ariable podemos decir que es el
2campo2 de la clase que representa al nombre del cliente&
Por otro lado si queremos mostrar el contenido de los campos que contiene la clase
*liente usaremos un procedimiento que nos permita mostrarlos ese procedimiento ser!
un mtodo de la clase *liente& Por tanto los miembros de una clase son las propiedades
(los datos) " los mtodos las acciones (funcionalidades) a realizar con esos datos&

8hora #amos al cdigo???

Para implementar todas estas caractersticas " funcionalidades debemos empezar a
programar para ello es que te dejo un ejemplo del cdigo que =habilita> un atributo para
poder interactuar con el resto del sistema

8gregue el cdigo siguiente para agregar una propiedad de lectura " escritura
llamada -ull'ame&
Public Property FullName() As String
Get
Return Me.Name
End Get
Set (Byal alue As String)
Me.Name ! alue
End Set
End Property
El descriptor de acceso =6et> de#uel#e el nombre del empleado& El descriptor de
acceso =3et> utiliza el par!metro =$alue> que se pasa en el descriptor de acceso 3et para
establecer el nombre del empleado&

*sto lo saqu, de http:--support.microso't.com-.b-/01+/0-es donde aparece el
cdigo y la e%plicacin completa, as# que, a pro'undi2ar33

En algunos libros tambin se denota de la siguiente manera+

Public Property Name() As String
Get
Return "name
End Get
Set (Byal alue As String)
"name ! alue
End Set
End Property

Docente: C. Felipe Fernndez Pgina 6


3i te fijas en ambos cdigos podr!s ad#ertir que uno diferencia por completo el
nombre de la propiedad " sus #alores (-ull'ame " 'ame) pero en el segundo caso tanto
la propiedad como el elemento tienen el mismo nombre con la 0nica diferencia que el
nombre del #alor lle#a antepuesto el smbolo =@> (underscore) esto es para mantener la
misma lgica de mantener nombres descripti#os&

)rear o de'inir una clase
8l igual que e(isten instrucciones para declarar o definir una #ariable o cualquier otro
elemento de un programa de $isual %asic e(isten instrucciones que nos permiten crear o
definir una clase& Para crear una clase debemos usar la instruccin )lass seguida del
nombre que tendr! dicha clase por ejemplo+

Class Cliente
A continuacin escribiremos el cdigo que necesitemos para implementar las
propiedades y m,todos de esa clase, pero para que !isual 4asic sepa que ya hemos
terminado de de'inir la clase, usaremos una instruccin de cierre:
End Class
Por tanto, todo lo que est, entre Class <nombre> y *nd 5lass ser la de'inicin
de dicha clase.
*e'inir los miem(ros de una clase
Para de'inir los miembros de una clase, escribiremos dentro del 6bloque6 de
de'inicin de la clase, las declaraciones y procedimientos que creamos conenientes
7incluyendo las propiedades que se describieron el punto anterior8 . !eamos un
ejemplo:
Nombre de la clase
Class Cliente

Este es la propiedad o atributo

Public Property Name() As String

Get
Return _name
End Get

Set (ByVal Value As String)
_name = Value
End Set

End Property


Docente: C. Felipe Fernndez Pgina 7

Este es el mtodo o funcionalidad
Sub Mostrar()

Console.WriteLine("El nombre del cliente:", Nombre)

End Sub
End Class

En este caso la lnea Public Property Nombre As String es decir hasta la lnea End
Pro#ert& estara definiendo una propiedad o 2campo2 p0blico de la clase *liente&
Por otro lado el procedimiento :ostrar sera un mtodo de dicha clase en esta
caso nos permitira mostrar la informacin contenida en la clase *liente&
Esta es la forma m!s simple de definir una clase " normalmente lo haremos
siempre as por tanto podemos comprobar que es mu" f!cil definir una clase as como
los miembros de dicha clase&
Pero no slo de clases #i#e el $isual %asic&&& o lo que es lo mismo Apara qu nos
sir#e una clase si no sabemos crear un objeto basado en esa clase&&&B 8s que sepamos
cmo crearlos&
8hora #eamos todo esto de forma practica??
)rear un o(jeto a #artir de una clase
*omo hemos #isto las clases definen las caractersticas " la forma de acceder a los
datos que contendr! pero slo eso los define&
Para que podamos asignar informacin a una clase " poder usar los mtodos de la
misma es decir para que podamos trabajar con ellas tenemos que crear un objeto
basado en esa clase o lo que es lo mismo+ tenemos que crear una nue#a instancia en la
memoria de dicha clase& Para ello haremos lo siguiente+
1efinimos una #ariable capaz de contener un objeto del tipo de la clase esto lo
haremos como con cualquier #ariable+
1im cli 8s *liente
Pero a diferencia de las #ariables basadas en los tipos #isto hasta ahora para
poder crear un objeto basado en una clase necesitamos algo m!s de cdigo que nos
permita 2crear2 ese objeto en la memoria "a que con el cdigo usado en la lnea
anterior simplemente estaramos definiendo una #ariable que es capaz de contener un
objeto de ese tipo pero a0n no e(iste ning0n objeto en la memoria para ello tendremos
que usar el siguiente cdigo+
cli C 'e. *liente()

Docente: C. Felipe Fernndez Pgina 8

*on esto le estamos diciendo al $isual %asic
D
+ crea un nue+o objeto en la memoria
del tipo *liente&
Estos dos pasos los podemos simplificar de la siguiente forma+
1im cli 8s 'e. *liente()
8 partir de este momento e(istir! en la memoria un objeto del tipo *liente&
Acceder a los miem(ros de una clase
Para acceder a los miembros de una clase (propiedades o mtodos) usaremos la
#ariable que apunta al objeto creado a partir de esa clase seguida de un punto " el
miembro al que queremos acceder por ejemplo para asignar el nombre al objeto cli
usaremos este cdigo+
cli.Nombre = "Guillermo"
Es decir de la misma forma que haramos con cualquier otra #ariable pero
indicando el objeto al que pertenece dicha #ariable& *omo podr!s comprobar esto "a lo
hemos estado usando anteriormente en el manejo de formularios&
9 para acceder al m,todo :ostrar:
cli.Mostrar()
-!cil noBBB

Pues as# es todo lo dems en .;*< )rame=or., as# que... ya tenemos una idea33







D
*n las ersiones anteriores de !isual 4asic no era recomendable usar esta 'orma de instanciar
un nueo objeto en la memoria, porque, aunque de 'orma transparente para nosotros, el
compilador aad#a cdigo e%tra cada e2 que se utili2aba esa ariable, pero en la ersin .;*<
no e%iste ese problema y por tanto no deteriora el rendimiento de la aplicacin.

Docente: C. Felipe Fernndez Pgina 9

Ejem#lo de cmo usar la ,erencia
Para poder usar la herencia en nuestras clases debemos indicar al I1E que esa es
nuestra intencin para ello disponemos de la instruccin In,erits" la cual se usa seguida
del nombre de la clase de la que queremos heredar& $eamos un ejemplo&
*mpe2aremos de'iniendo una clase 6base6 la cual ser la que heredaremos en
otra clase.
;a sabemos cmo definir una clase aunque para este ejemplo usaremos la clase
*liente que #imos anteriormente despus crearemos otra llamada *liente:oroso la cual
heredar! todas las caractersticas de la clase *liente adem!s de a5adirle una propiedad a
esa clase deri#ada de *liente&
$eamos el cdigo de estas dos clases&
Para ello crea un nue#o pro"ecto $isual %asic del tipo consola (esto "a deberas
saber cmo hacerlo) " escribe las siguientes lneas al principio o al final del fichero que el
I1E a5ade de forma predeterminada&
Class Cliente
Public Nombre As String

Sub Mostrar()
Console.WriteLine("El nombre del cliente: {0}", Nombre)
End Sub
End Class

Class ClienteMoroso
Inherits Cliente

Public Deuda As Decimal

End Class
*omo puedes comprobar para que la clase *liente:oroso herede la clase *liente
he usado In,erits )liente con esta lnea (la cual debera ser la primera lnea de cdigo
despus de la declaracin de la clase) le estamos indicando al $% que nuestra intencin
es poder tener todas las caractersticas que la clase *liente tiene& Eaciendo esto
a5adiremos a la clase *liente:oroso la propiedad 'ombre " el mtodo :ostrar aunque
tambin tendremos la nue#a propiedad que hemos a5adido+ 1euda&

Docente: C. Felipe Fernndez Pgina 10

Ahora amos a er cmo podemos usar estas clases, para ello amos a aadir
cdigo en el procedimiento :ain del mdulo del proyecto:
Module Module1

Sub Main()
Dim cli As New Cliente()
Dim cliM As New ClienteMoroso()
'
cli.Nombre = "Guille"
cliM.Nombre = "Pepe"
cliM.Deuda = 2000
'
Console.WriteLine("Usando Mostrar de la clase Cliente")
cli.Mostrar()
'
Console.WriteLine("Usando Mostrar de la clase ClienteMoroso")
cliM.Mostrar()
'
Console.WriteLine("La deuda del moroso es: {0}", cliM.Deuda)
'
Console.ReadLine()
End Sub

End Module

4o que hemos hecho es crear un objeto basado en la clase *liente " otro basado en
*liente:oroso& 4e asignamos el nombre a ambos objetos " a la #ariable cli: (la del
*liente:oroso) le asignamos un #alor a la propiedad 1euda& -jate que en la clase
*liente:oroso no hemos definido ninguna propiedad llamada 'ombre pero esto es lo
que nos permite hacer la herencia+ heredar las propiedades " mtodos de la clase base&
Por tanto podemos usar esa propiedad como si la hubisemos definido en esa clase&
Esto mismo ocurre con los mtodos el mtodo :ostrar no est! definido en la
clase *liente:oroso pero s lo est! en la clase *liente " como resulta que *liente:oroso
hereda todos los miembros de la clase *liente tambin hereda ese mtodo&


Docente: C. Felipe Fernndez Pgina 11

>a salida de este programa ser#a la siguiente:
Usando Mostrar de la clase Cliente
El nombre del cliente: Guille
Usando Mostrar de la clase ClienteMoroso
El nombre del cliente: Pepe
La deuda del moroso es: 2000
*omo puedes #er no es tan complicado esto de la herencia&&&
8hora #eamos cmo podramos hacer uso del polimorfismo o al menos una de las
formas que nos permite el &'E, -rame.or/&
<eniendo ese mismo cdigo que de'ine las dos clases, podr#amos hacer lo
siguiente:
Sub Main()
Dim cli As Cliente
Dim cliM As New ClienteMoroso()
'
cliM.Nombre = "Pepe"
cliM.Deuda = 2000
cli = cliM
'
Console.WriteLine("Usando Mostrar de la clase Cliente")
cli.Mostrar()
'
Console.WriteLine("Usando Mostrar de la clase ClienteMoroso")
cliM.Mostrar()
'
Console.WriteLine("La deuda del moroso es: {0}", cliM.Deuda)
'
Console.ReadLine()
End Sub
En este caso la #ariable cli simplemente se ha declarado como del tipo *liente
pero no se ha creado un nue#o objeto simplemente hemos asignado a esa #ariable el
contenido de la #ariable cli-&

Docente: C. Felipe Fernndez Pgina 12


*on esto lo que hacemos es asignar a esa #ariable el contenido de la clase
*liente:oroso pero como comprender!s la clase *liente 2no entiende2 nada de las
nue#as propiedades implementadas en la clase deri#ada por tanto slo se podr! acceder
a la parte que es com0n a esas dos clases+ la parte heredada de la clase Cliente.
Fealmente las dos #ariables apuntan a un mismo objeto por eso al usar el mtodo
:ostrar se muestra lo mismo& 8dem!s de que si hacemos cualquier cambio a la
propiedad 'ombre al e(istir slo un objeto en la memoria ese cambio afectar! a ambas
#ariables&
Para comprobarlo a5ade este cdigo antes de la lnea *onsole&Fead4ine()+
Console.WriteLine()
cli.Nombre = "Juan"
Console.WriteLine("Despus de asignar un nuevo nombre a cli.Nombre")
cli.Mostrar()
cliM.Mostrar()
4a salida de este nue#o cdigo sera la siguiente+
Usando Mostrar de la clase Cliente
El nombre del cliente: Pepe
Usando Mostrar de la clase ClienteMoroso
El nombre del cliente: Pepe
La deuda del moroso es: 2000

Despus de asignar un nuevo nombre a cli.Nombre
El nombre del cliente: Juan
El nombre del cliente: Juan
4a parte en gris es lo que se mostrara antes de realizar el cambio&
*omo puedes comprobar al cambiar en una de las #ariables el contenido de la
propiedad 'ombre ese cambio afecta a las dos #ariables pero eso no es porque ha"a
nada m!gico ni ning0n fallo es por lo que te coment antes+ slo e(iste un objeto en la
memoria " las dos #ariables acceden al mismo objeto por tanto cualquier cambio
efectuado en ellas se reflejar! en ambas #ariables por la sencilla razn de que slo ha"
un objeto en memoria&

Docente: C. Felipe Fernndez Pgina 13

A este tipo de ariables se las llama ariables por re'erencia, ya que hacen
re'erencia o apuntan a un objeto que est! en la memoria& 8 las #ariables que antes
hemos estado #iendo se las llama #ariables por #alor "a que cada una de esas #ariables
tienen asociado un #alor que es independiente de los dem!s& 8ntes de seguir una
peque5a e(plicacin de esto 0ltimo+
Ti#os de datos #or +alor $(& +al%
*uando dimensionamos una #ariable por ejemplo de tipo Integer el Common
Language Runtime o CLR
3
("entorno en tiempo de ejecucin de lenguaje comn") reser#a
el espacio de memoria que necesita para almacenar un #alor del tipo indicadoG cuando a
esa #ariable le asignamos un #alor el *4F almacena dicho #alor en la posicin de
memoria que reser# para esa #ariable& 3i posteriormente asignamos un nue#o #alor a
dicha #ariable ese #alor se almacena tambin en la memoria sustitu"endo el anterior
eso lo tenemos claro "a que as es como funcionan las #ariables& 3i a continuacin
creamos una segunda #ariable " le asignamos el #alor que contena la primera
tendremos dos posiciones de memoria con dos #alores que por pura casualidad resulta
que son iguales entre otras cosas porque a la segunda hemos asignado un #alor 2igual2 al
que tena la primera&
Tipos de datos por referencia (by ref)
En $%&'E, tambin podemos crear objetos los objetos se crean a partir de una
clase (,al como estamos #iendo)& *uando dimensionamos una #ariable cu"o tipo es una
clase (como en los ejemplos usados+ 1e tipo =cliente>) simplemente estamos creando
una #ariable que es capaz de manipular un objeto de ese tipo en el momento de la
declaracin el *4F no reser#a espacio para el objeto que contendr! esa #ariable "a que
esto slo lo hace cuando usamos la instruccin 'e.& En el momento en que creamos el
objeto (mediante 'e.) es cuando el *4F reser#a la memoria para dicho objeto " le dice
a la #ariable en que parte de la memoria est! almacenado de forma que la #ariable
pueda acceder al objeto que se ha creado& 3i posteriormente declaramos otra #ariable
del mismo tipo que la primera tendremos dos #ariables que saben 2manejar2 datos de
ese tipo pero si a la segunda #ariable le asignamos el contenido de la primera en la
memoria no e(istir!n dos copias de ese objeto slo e(istir! un objeto que estar!
referenciado por dos #ariables& Por tanto cualquier cambio que se haga en dicho objeto
se reflejar! en ambas #ariables&

/ *ntorno de ejecucin para los cdigos de los programas que corren sobre la
plata'orma :icroso't .;*<. *l 5>? es el encargado de compilar una 'orma de cdigo intermedio
llamado 5ommon @ntermediate >anguage al cdigo de maquina natio, mediante un compilador
en tiempo de ejecucin. >os desarrolladores que usan 5>? escriben el cdigo 'uente en un
lenguaje compatible con .;*<, como 5A o !isual 4asic .;*<. *n tiempo de compilacin, un
compilador .;*< conierte el cdigo a 5@>. *ntiempo de ejecucin, el compilador del 5>?
conierte el cdigo 5@> en cdigo natio para el sistema operatio. Alternatiamente, el cdigo
5@> es compilado a cdigo natio en un proceso separado anterior a la ejecucin. *sto acelera
las posteriores ejecuciones del so't=are debido a que la compilacin de :"@> a natio ya no es
necesaria.

Docente: C. Felipe Fernndez Pgina 14


1ejemos esto hasta aqu&&& no sin resumir un poco lo que hemos #isto hasta ahora de esta
forma por si eres de los que empiezan a leer por el final en fin& Eemos #isto las
condiciones que un lenguaje debe cumplir para que sea considerado orientado a objetos+
herencia encapsulacin " polimorfismo& ,ambin hemos aprendido a definir una clase "
sus propiedades " a deri#ar (heredar) una clase a partir de otra por medio de la
instruccin Inherits& ;a sabemos cmo definir #ariables cu"o tipo sea una clase " cmo
crear nue#os objetos en memoria a partir de una clase& ,ambin hemos comprobado que
el que e(ista m!s de una #ariable del tipo de una clase no significa que e(ista un objeto
independiente para cada una de esas #ariables " por 0ltimo hemos comprobado que son
las #ariables por referencia " cmo afectan a los objetos referenciados por ellas&
8hora #amos #eremos otros conceptos asociados a la POO
CONSTRUCTORES Y DESTRUCTORES
*uando creamos un objeto a partir de una clase se sigue un proceso el cual
empieza en el momento en que decidimos crear una nue#a instancia de dicha clase&
En estos casos el compilador utiliza lo que se llama el constructor de la clase&
3iempre que se crea un nue#o objeto en la memoria est! in#olucrado el constructor de la
clase& 4os constructores son procedimientos especiales (funciones que no de#uel#en un
#alor) en los que podemos escribir toda la lgica que debe usarse para la correcta
creacin del objeto& Por ejemplo podemos inicializar las #ariables usadas podemos
asignarle algunos #alores predeterminados etc&
1e igual forma cuando un objeto "a no se necesita m!s se destru"e mediante una
llamada al destructor de la clase& En &'E, la destruccin de los objetos suele hacerse de
forma automatizada es decir a diferencia de lo que ocurre en otros entornos de
programacin no es necesario destruir e(plcitamente un objeto para eliminarlo de la
memoria esa gestin de limpieza de objetos la realiza el recolector de basura (Garbage
Collector 6*) de &'E, el cual decide cuando un objeto no se necesita m!s " en ese caso
lo elimina dejando libre la memoria utilizada para otros menesteres&
1ebido a que todas las clases (" estructuras) deben tener un constructor si
nosotros no lo definimos de forma e(presa ser! el propio compilador el que se encargue
de a5adirlo por nosotros en ese caso ser! un constructor en el que no se reciba ning0n
argumento&

8unque ha" que tener presente que en el momento en que hemos definido un
constructor el compilador "a no agregar! ninguno de forma autom!tica& Esto tiene sus
#entajas "a que en ocasiones es posible que nos interese que nuestras clases solamente

Docente: C. Felipe Fernndez Pgina 15

se puedan instanciar si se le pasa algunos par!metros al constructor de la misma&
Pero si adem!s de un constructor con par!metros queremos seguir manteniendo el
constructor 2predeterminado2 entonces tendremos que declararlo aunque no
escribamos nada de cdigo en el interior& En resumen al instanciar el objeto con la
palabra reser#ada ='E)> estamos in#ocando la clase constructora del Objeto&

.O/0E)A0GA $O1E0LOA*%
<na de las caractersticas que tambin nos ofrece los lenguajes orientados a
objetos es la posibilidad de definir #arias funciones de las clases con un mismo nombre
de esta forma podremos crear #ersiones diferentes por ejemplo para que reciban
argumentos de distintos tipos sin necesidad de cambiarle el nombre&
3upongamos que queremos hacer una funcin que realice cualquier tipo de
operacin sobre dos #alores numricos sera lgico pensar que si esos #alores son de
tipo entero el resultado que de#uel#a la funcin tambin debera ser de tipo entero en
caso de que los #alores a usar en la operacin son de tipo flotante el resultado podra
de#ol#erlo de ese mismo tipo&
En los lenguajes no orientado a objetos tendramos que crear dos funciones con
nombres diferentes por ejemplo+ sumaInt " sumaFloat& Pero la sobrecarga nos permite
crear dos funciones que se llamen suma " el compilador utilizar! la adecuada seg0n el
tipo de datos que pasemos como argumentos&
El 0nico requisito para poder crear sobrecargas de mtodos es que las diferentes
#ersiones se diferencien en los argumentos "a sea porque sean de diferentes tipos de
datos o porque el n0mero de argumentos usados sea diferente de esa forma el
compilador no tendr! ning0n problema en saber cu!l debe usar en cada ocasin& 4a
sobrecarga la podemos aplicar tanto a los constructores como a cualquier otro mtodo
de la clase&

NOTA: Sobrecara
;o e%istir la posibilidad de crear m,todos sobrecargados si solamente se
di'erencian en el tipo de datos deuelto, ya que en esos casos el compilador
no podr decidir correctamente qu, m,todo debe utili2ar.



Docente: C. Felipe Fernndez Pgina 16

Los 'ormatos $codi'icacin% de los arc,i+os
8ntes de empezar 2de #erdad2 con la forma de leer " escribir en los ficheros
mediante las clase de &'E, debemos saber que en &'E, se pueden leer " escribir los
ficheros usando diferentes codificaciones&
Para comprender a cabalidad esto de la codi'icacin, accede a:
http:--msdn.microso't.com-esBes-library-1c+dcC1DBDcE0BF1+FBa(DFB
G00/+E1F1Gbb.asp%
Para efecto del curso diremos que en &'E, de forma predeterminada el formato
o codificacin usado para leer o escribir en los ficheros es <,-9H&
!"#$ proble%a &ay con esto'

'inguno al menos si siempre lees " escribes usando las clases de &'E, pero si tu
intencin es poder leer un archi#o guardado por ejemplo con una aplicacin de $isual
%asic I (o el 'otepad de )indo.s) o quieres que lo que tu guardes se pueda abrir
tambin con cualquier otra aplicacin deber!s tener cuidado con la codificacin usada&
8l menos si el contenido de ese fichero tiene caracteres como la e5e #ocales acentuadas
signos de apertura de admiracin o interrogacin etc& "a que en esos casos el formato
usado por defecto por otras aplicaciones para )indo.s no ser! el adecuado " esos
caracteres no se leer!n correctamente&
Por tanto si decides que lo que #as a guardar o leer debe ser 2compatible2
tendr!s que usar la codificacin predeterminada de )indo.s (8'3I) esa codificacin
puedes indicarla mediante la clase Encoding (definida en el espacio de
nombres .&stem.Te2t) " usando el #alor *e'ault despus #er!s ejemplos de cmo usar
esos #alores a la hora de leer o de escribir en un fichero&
Leer & escri(ir 'ic,eros de te2to
4eer " escribir archi#os es mu" simple "a que lo podemos hacer usando un par de
lneas de cdigo&
$eamos un ejemplo de cmo guardar en un Arc,i+o el contenido de una cadena
de te(to+
Const Arch As String = "E:\tmp\Prueba.txt"
Dim texto As String = "rase una vez una vieja con un moo..."

Dim sw As New System.IO.StreamWriter(Arch)
sw.WriteLine(texto)
sw.Close()

Docente: C. Felipe Fernndez Pgina 17

*omo puedes comprobar lo 0nico que necesitamos es crear un objeto del
tipo .tream3riter (definido en el espacio de nombres .&stem.IO) pasarle al constructor
el nombre del archi#o en el que queremos guardar " usar el mtodo 3riteLine al que le
indicamos como argumento la cadena que queremos guardar&
Ahora amos a leer de #n arc&i(o y asignaremos el contenido del mismo a
una ariable.
Const Arch As String = "E:\tmp\Prueba.txt"
Dim texto As String

Dim sr As New System.IO.StreamReader(Arch)
texto = sr.ReadToEnd()
sr.Close()

Console.WriteLine(texto)
En este caso tambin es mu" simple "a que solo necesitamos usar un objeto del
tipo .tream0eader (tambin definido en el espacio de nombres .&stem.IO) al que le
indicamos de qu archi#o queremos leer " por medio del mtodo 0eadToEnd leemos
todo el contenido el cual asignamos a la #ariable que usemos en la asignacin&
En estos dos ejemplos al no indicar lo contrario estamos usando la codificacin
predeterminada es decir <,-9H por tanto si escribimos primero en ese archi#o "
despus lo leemos el te(to se mostrar! correctamente a pesar de que en el primer
ejemplo ha"amos usado #ocales acentuadas " e5es&
8dem!s de que al usar la clase .tream3riter de esa forma si haba un archi#o con
ese mismo nombre se eliminar! " se quedar! el que acabamos de escribir es decir se
sustitu"e el contenido del fichero&
Ane2ar contenido a un Arc,i+o e2istente
8ntes de #er otras cosas #eamos cmo agregar contenido a un fichero es decir si
ese fichero e(iste lo que haremos es a5adir m!s contenido de forma que despus de
escribir lo que tendr! ser! lo que antes hubiere m!s lo que ahora escribamos&
Para conseguir esto lo 0nico que tenemos que hacer es indicar en el constructor de
la clase .tream3riter un segundo argumento con un #alor #erdadero&
1e esa forma si el archi#o e(iste se a5adir! el te(to al final de lo que "a tu#iera& 3i el
fichero no e(iste simplemente se crear! " se guardar! el te(to actual pero no dar! error
de que no e(iste&

Docente: C. Felipe Fernndez Pgina 18

$eamos el cdigo para a5adir te(to a un fichero e(istente (o crearlo si no e(iste)+
Const Arch As String = "E:\tmp\Prueba.txt"
Dim texto As String = "Pablito tena una moto con un pito."

Dim sw As New System.IO.StreamWriter(Arch, True)
sw.WriteLine(texto)
sw.Close()
*omo #es lo 0nico que ha" que hacer es indicar como segundo argumento del
constructor de la clase .tream3riter un #alor #erdadero " de esa forma le indicamos
que queremos agregar el te(to al archi#o&
3i en #ez de usar un #alor #erdadero indicas un #alor falso ('alse) el
comportamiento ser! como el del primer ejemplo es decir se sobrescribir! el fichero
eliminando lo que antes hubiera&
Usar una codi'icacin es#ec4'ica
*omo te he comentado antes si no indicamos lo contrario los archi#os se leer!n "
se guardar!n usando la codificacin <,-9H& Pero si queremos usar una distinta debemos
indicarlo de forma e(presa&
Por ejemplo si queremos leer ficheros escritos por otros programas que usan la
codificacin est!ndar de )indo.s por ejemplo los ficheros creados con $isual %asic I&J
debemos indicar que 'O queremos usar el formato predeterminado esto lo haremos de
la siguiente forma+
Const fic As String = "E:\tmp\Prueba2.txt"
Dim texto As String

Dim sr As New System.IO.StreamReader(fic, System.Text.Encoding.Default)
texto = sr.ReadToEnd()
sr.Close()
Console.WriteLine(texto)
En este caso lo 0nico que debemos hacer es indicar en el constructor de la
clase .tream0eader un segundo argumento que es la codificacin que queremos usar en
este caso .&stem.Te2t.Encoding.*e'ault&


Docente: C. Felipe Fernndez Pgina 19

Para escribir en esa codificacin (o en cualquier otra) tendremos que indicar la
codificacin a usar en el tercer argumento del constructor de la clase .tream3riter "a
que en el segundo debemos indicar si queremos agregar el te(to a lo que "a tu#iera o
bien crear el fichero usando solo el contenido que queremos guardar& En caso de que
queramos crear un fichero con el contenido que tenemos en una #ariable usaremos el
siguiente cdigo+
Const fic As String = "E:\tmp\Prueba2.txt"
Dim texto As String = "rase una vez una vieja con un moo..."

Dim sw As New System.IO.StreamWriter(fic, False, System.Text.Encoding.Default)
sw.WriteLine(texto)
sw.Close()
Por supuesto si lo que queremos hacer es agregar el te(to al archi#o en #ez de
usar 'alse en el segundo argumento debemos usar true&
; si en #ez de usar el #alor 2*e'ault2 queremos usar otro tipo de codificacin lo
indicaremos en el tercer argumento seleccionando uno de los #alores de la
clase Encoding&
1ebo aclarar que si usamos el #alor <,-H se guardar! (o leer!) usando la
codificacin <,-9H pero a la hora de guardarlo se indicar! al principio del archi#o que la
codificacin usada es <,-9H esto es algo que no se guarda cuando no indicamos la
codificacin& Es decir se guarda en formato <,-9H pero no se almacena nada que
indique que ese es el formato del archi#o&
Esto es lo que se conoce como %O: (Byte Order Marks) que no es otra cosa que
una marca al principio del archi#o en la que se indica la codificacin usada& 4as tres
codificaciones que almacenan #alores %O: son+ <,-9H <nicode 4ittle9Endian " <nicode
%ig9Endian estos dos 0ltimos pueden ser <,-97I o <,-9KD (este 0ltimo solo en &'E,
-rame.or/ D&J o superior)& 3i quieres saber m!s sobre esto del %O: puedes #er en la
a"uda de $isual 3tudio el mtodo GetPream(le de la clase Encoding en+
http:--msdn.microso't.com-esBes-library-"ystem.<e%t.*ncoding.HetPreamble.asp%





Docente: C. Felipe Fernndez Pgina 20

E)ercicios

9) Implemente una clase de nombre ,$ con los siguientes atributos+ n0mero de serie
marca (3on" PhillipsPanasonic 463amsung) a5o de fabricacin " precio en dlares &
*onsidere un mtodo que calcule el precio en dlares cuando se le ingrese en Pesos
*hilenos& 4uego 1ise5e el formulario para ingresar los datos del ,$ con un botn que
permita guardar en un archi#o los datos del Producto&
9) Implemente una clase de nombre Empleado con los siguientes atributos+ cdigo
nombre departamento sueldo horas e(tras afiliacin a una 8-P& 8dem!s considere
atributos de #alores comunes para todos los empleados para los porcentajes de
descuento por afiliacin a una 8-P (7DL del sueldo) " por salud ( ML del sueldo )&
*onsidere mtodos de c!lculo para el monto de horas e(tras (sueldo b!sicoNDOJ P horas
e(tras) monto de los descuentos por 8-P por 3'P por salud monto total de descuentos
sueldo total sueldo ne


























como parmetro



Docente: C. Felipe Fernndez Pgina 21

S-ar putea să vă placă și