Sei sulla pagina 1di 94

Unidad 2

Programacin Orientada a
Objetos
(Segunda Parte)

Asignatura: Programacin Orientada a Objetos


Licenciatura en Ciencias de la Computacin
Licenciatura en Sistemas de Informacin

Departamento de Informtica
FCEFN UNSJ
Ao 2011
1
Bibliografa y Sitios WEB

(*1) El lenguaje de Programacin C# - Fco. Javier Ceballos

(*2) El lenguaje de Programacin C# - Jose A. Gonzalez Seco.

(*3) C# Cmo Programar. Deitel y Deitel.

(*4) Professional C# 3rd Edition. Robinson, Nagel, etc.

(*5) Pro C# 2005 and the .NET 2.0 Plataform

(*6) http://www.msdn.microsoft/es-es/vcsharp/

2
Relaciones entre Clases en C# (1)

En la primera etapa del DOO, se identifican las clases.

Aunque algunas clases pueden existir aisladas, la mayora no puede, y deben


cooperar unas con otras.

Las relaciones entre las clases expresan una forma de acoplamiento entre ellas.

Segn el tipo de acoplamiento que presentan las clases podemos distinguir


distintos tipos de relaciones.

Asociacin - Agregacin Composicin - Herencia

3
Relaciones entre Clases en C# (2)

4
Asociacin (1)

Una asociacin de UML se implementa en C# como una referencia a otro elemento o


una coleccin de elementos, pero en este caso el otro elemento es consciente de la
referencia.
La mayora de asociaciones son navegables en ambos sentidos, es decir, si un objeto A
tiene una referencia al objeto B, entonces por definicin del objeto B tiene una
referencia al objeto A. No obstante pueden haber asociaciones que se navegan slo en
un sentido.

Provincia Gobernador

-nombre: nombre Es dirigida -dni: string


- cant_habitantes -nombre: nombre
1 1

+ Provincia() + Gobernador()
+ +

5
Asociacin (2)

Narrativa: Como estrategia de mercado un shopping en un da especial present una promocin


para sus clientes. El cliente puede comprar en cualquier local del shopping y en cada local se le
realizar la factura por el total consumido. Por cada compra que supera los $250 se les
descuenta $25. Por cada compra menor se le reintegra $10
Al trmino de sus compras, al cliente se le restituye un porcentaje de dinero en concepto de
descuento si compr en ms de 3 locales(es decir tiene ms de 3 facturas). En este caso se le
hace un reintegro del 12% del importe total gastado.
Cabe aclarar que ese da todas las facturas que se emitan tienen nmero de factura consecutivo
a partir del 1000.

El sistema va registrando las compras de todos los clientes con las facturas que emiten en los
distintos locales a medida que el cliente realiza sus compras.
El sistema permite:
1. Informar a un cliente cada una de las compras realizadas incluyendo: nmero e importe de
cada factura, e importe total acumulado.
2. Informar a un cliente sobre la bonificacin que recibir por todas sus compras realizadas

6
Asociacin (3)

Factura Cliente

-nro_f:int - dni:string;

-importe: float - telefono:string

-descuento:float - direccion:string

-nro_factura:int {static} 1..* 1


+Cliente.()
+
+ Factura(..) +
+ set_importe(float) +
+ float obtenerTotal()
+Cliente obtenerCliente()
+ float obtener_numFactura()

7
Asociacin (4)

public class Factura public void set_importe(float i) {


{ importe = i;
int nro_f; }
private float importe;
private float descuento; public float obtenerTotal() {
static private int nro_factura = 1000; return importe - descuento;
Cliente cli; }
public Cliente obtenerCliente()
public Factura( float importe, Cliente cli) { {
nro_f= nro_factura++; return cli;
this.importe = importe; }
if (importe > 250)
descuento = 25; public int obtener_numFactura()
else descuento = 10; ; {
this.importe = importe; return nro_f;
this.cli = cli; }
} }

8
Asociacin (5)
public class Cliente {
private string dni;
private string telefono;
private string direccion;
Factura []fac;
int tope;
public Cliente() { }
public Cliente(string dni, string telefono, string direccion) {
fac = new Factura[100];
tope = 0;
this.dni = dni;
this.telefono=telefono;
this.direccion = direccion;
}

public string obtener_dni() {


return dni;
}
public void add_factura(Factura F) {
fac[tope] = F;
tope++;
if (tope == 100)
Array.Resize(ref fac, 50); }

}
9
http://www.devx.com/enterprise/Article/28576

Investigue este concepto de


asociacin en este sitio
Clase Asociacin (1)
En algunas situaciones es necesario mantener la informacin que es especfica de la propia
asociacin, pero no a cualquiera de los socios.
Supongamos un sistema que almacena informacin sobre mujeres y varones vinculados a travs
del matrimonio por la iglesia catlica. Si se desea agregar informacin inherente al acta
matrimonial (por ej. Frecha, iglesia, nombre del sacerdote, esta informacin debe ser almacenada
como atributos de una clase asociacin.
Principio Fundamental:
Varon Mujer
Es casado Una instancia de clase
-nombre: nombre
-nombre: nombre asociacin siempre se
1 1 - .
- relaciona a una nica
+ instancia de la clase en un
+
Acta
extremo y a una nica
instancia de la clase en el
-Fecha: string otro extremo. No importa la
multiplicidad en ambos
- iglesia: string
extremos. Una instancia de
- la clase asociacin
+ representa una relacin uno 10
a uno.
http://www.devx.com/enterprise/Article/28576

Investigue este concepto de


asociacin en este sitio
Clase Asociacin (2)

Vuelo Vendedor de Billetes

dni: string
-nombre: nombre
-nombre: nombre
- cant_habitantes
+
+
1
1 Reserva

-vuelo
n n
- vendedor

Para una tupla Vuelo Vendedor de Billetes, existen ms de un objeto de la clase Reserva. Esto
es, podemos tener mltiples reservas por vuelo y vendedor. En este caso no podemos definir a
Reserva como una clase asociacin, sino que existe una relacin de asociacin entre Vuelo
y Vendedor de Billetes que se deriva o modela a travs de Reserva
11
Agregacin Agregacin (1)
Un objeto de una clase contiene como partes a objetos de otras clases
La destruccin del objeto continente no implica la destruccin de sus partes.
Los tiempos de vida de los objetos continente y contenido no estn tan estrechamente acoplados, de
modo que se pueden crear y destruir instancias de cada clase independientemente.

Bebida

- cantidad: int
- denominacion: string
Orden
+ Bebida() : void
- mesa: int
+ mostrarDatos() : void
- mesero: string

+ Orden() : void
+ mostrarDatos() : void PlatoPrincipal

- cantidad: int
- denominacion: string

+ PlatoPrincipal() : void
+ mostrarDatos() : void

12
Agregacin Agregacin (2)

class Bebida{ class PlatoPrincipal{


private int cantidad; private int cantidad;
private string denominacion; private string denominacion;
private double precio; private double precio;
public Bebida(int c, string d, double p){ public PlatoPrincipal(int c, string d, double p){
cantidad = c; cantidad = c;
denominacion = d; denominacion = d;
precio = p; precio = p;
} }
public void mostrarDatos(){ public void mostrarDatos(){
Console.WriteLine("Cantidad: {0}",cantidad); Console.WriteLine("Cantidad: {0}",cantidad);
Console.WriteLine("Denominacin: {0}",denominacion); Console.WriteLine("Denominacin: {0}",denominacion);
Console.WriteLine("Precio Unitario: {0}", precio); Console.WriteLine("Precio: {0}",precio);
} }
} }

13
Agregacin Agregacin (3)

class Pedido {
private int mesa;
private string mesero;
private Bebida bebida; // referencia al agregado
private PlatoPrincipal plato; // referencia al agregado
public Pedido(int m, string mozo,Bebida b, PlatoPrincipal p){
mesa = m;
mesero = mozo;
bebida = b;
plato = p;
}
public void mostrarDatos(){
Console.WriteLine("Nmero de Mesa: {0}",mesa);
Console.WriteLine("Mozo: {0}",mesero);
Console.WriteLine("Plato Principal: ");
plato.mostrarDatos();
Console.WriteLine("Bebida:");
bebida.mostrarDatos();
}
}
14
Agregacin Agregacin (4)

static void Main(string[] args){


Bebida b = new Bebida(1, "Sprite 1 1/2L",3.79);
PlatoPrincipal p = new PlatoPrincipal(2, "Lomo Especial",22.50);
Pedido pedido1 = new Pedido(1, "Ros, Andrs", b, p);
Pedido pedido2 = new Pedido(15, "Fernandez, Adrian", b, p);
pedido1.mostrarDatos();
pedido2.mostrarDatos();
Console.ReadKey();
}

// los agregados se crean fuera de la clase

15
(*) Pro C# 2005 and the .NET 2.0 Plataform Cap. 6 Pg. 146
Composicin _Ejemplo

Agregacin Composicin (1)

Un objeto de una clase contiene como partes a objetos de otras clases y estas partes estn fsicamente
contenidas por el agregado.

Los tiempos de vida de los objetos continente y contenido estn estrechamente acoplados
La destruccin del objeto continente implica la destruccin de sus partes.
class System

E_Mail
Alumno
- Id_cuenta: string
- registro: int
- dominio: string
- nombre: string - tipo_dominio: string
- curso: int - contrasena: string

+ Alumno() : void + E_Mail() : void


+ mostrarDatos() : void + Retorna_E_Mail() : string
+ Get_domio() : string

16
E_Mail.cs
Agregacin Composicin (2)

public string Get_Domino() {


return dominio;
namespace composicion_1{ }
public class E_Mail public void setID(string s) {
{ string id_cuenta; id_cuenta=s;
string dominio; }
string tipo_dominio; public void setdominio(string s)
string contrasena; {
public E_Mail() { } dominio = s;
public E_Mail(string i, string d, string t, string c) }
{ id_cuenta = i; public void settipo(string s) {
dominio = d; tipo_dominio = s;
tipo_dominio = t; }
contrasena = c; public void setclave(string s) {
} contrasena = s;
~E_Mail() { }
Console.WriteLine("Mail eliminado"); }
} }
public string Retorna_Email()
{ string s = id_cuenta + "@" + dominio + "." + tipo_dominio;
return s;
}
17
alumno.cs

Agregacin Composicin (3)

namespace Composicin__Ejemplo
{
public class Alumno {
private int registro;
private string nombre;
private int curso;
private E_Mail mail= new E_Mail(); //el agregado se crea dentro de la clase
public Alumno(int r, string n, int c, string i, string d, string t, string cl){
registro = r;
nombre = n;
curso = c;
mail.setID(i);
mail.setdominio(d);
mail.settipo(t);
mail.setclave(cl);
}

18
Agregacin Composicin (4)
~ Alumno() {
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("Alumno eliminado");
}
public void mostrarDatos(){
Console.WriteLine("Datos del Alumno: {0}",nombre);
Console.WriteLine("Curso: {0}",curso);
Console.WriteLine("E_Mail: {0}", mail.Retorna_Email());

} }}

class Program { program.cs


static void Main(string[] args) {
Alumno A = new Alumno(11234, "Ana Perez", 3, "ana_200", "gmail", "com", "ANITA");
A.mostrarDatos();
Console.ReadKey();
}
} 19
ACTIVIDAD CONJUNTA 4
Implementar una lista enlazada de alumnos y realizar un programa que responda al
siguiente men de opciones:
1: Insertar alumno
2: Mostrar alumnos
3: Eliminar alumno

Utilizar la clase Alumno antes definida, si es necesario, agregar los mtodos que crea conveniente

public class Lista {


public class nodo nodo comienzo;
{ public Lista()
private Alumno dato;
private nodo siguiente;
{ comienzo = null;
public nodo() { }
dato = new Alumno(); ~Lista() {
siguiente = null; Console.WriteLine("Lista eliminada");
} Console.ReadKey();
----- }
----- 20
Lista_Enlazada
Esquema de la lista enlazada de alumnos

lista
:Lista :nodo
comienzo dato
.
:nodo :nodo

dato dato
:Alumno
Null
:Alumno 8752
:E_Mail Ana Perez
12563
1

5
:Alumno
11245 Luis Flores :E_Mail

4 Ana Garcia

:E_Mail

21
Vista del proyecto con las tres clases utilizadas

22
Clase nodo Lista_Enlazada

namespace MI_Lista {

public class nodo


{
private Alumno dato;
private nodo siguiente;
public nodo() {
dato = new Alumno();
siguiente = null;
}
public void setDato(Alumno o) {
dato = o;
}
public void setSiguiente(nodo dir) {
siguiente = dir;
}
public nodo getSiguiente() {
return siguiente;
}
public Alumno getDato() {
return dato;
}
23
}
Clase Lista Lista_Enlazada
public class Lista {
nodo comienzo;
public Lista()
{
comienzo = null;
}
~Lista() {
Console.WriteLine("Lista eliminada");
Console.ReadKey();
}

public void insertar(Alumno o) {


nodo aux = new nodo();
aux.setDato(o);
aux.setSiguiente(comienzo);
comienzo = aux;
}
public nodo get_comienzo() {
return comienzo;
}

public void mostrarElementos() {


nodo aux = comienzo;
while (aux != null) {
Alumno dato = aux.getDato();
dato.mostrarDatos();
aux = aux.getSiguiente();
}
24
}
Clase Lista Lista_Enlazada
public void eliminar(string n)
{ nodo p, aux;
if (comienzo == null)
Console.WriteLine(" lista Vacia");
{
if ((comienzo.getDato()).obtener_nombre() == n)
{ p = comienzo;
comienzo = comienzo.getSiguiente();
p = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
else {
p = comienzo.getSiguiente();
aux = comienzo;
while ((aux != null) && !((aux.getDato()).obtener_nombre() == n))
{ p = aux;
aux = aux.getSiguiente();
}
if (aux != null)
{ p.setSiguiente(aux.getSiguiente());
p = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
else Console.WriteLine("El alumno no est");
}
}
}
} }// fin namespace MI_Lista 25
Clase Program
namespace Lista_Enlazada
{
class Program
{
static void Main(string[] args)
{ int op;
string nom;
int reg, cur;
string i,d,t,c;
Lista lista = new Lista();
do
{ Console.Clear();
Console.WriteLine("1: Insertar alumno");
Console.WriteLine("2: Mostrar alumnos");
Console.WriteLine("3: Eliminar alumno");
op = int.Parse(Console.ReadLine());
switch (op)
{ case 1:
Console.Write("\n \n \n Ingrese Nombre"); nom = Console.ReadLine();
Console.Write("\n Ingrese Registro"); reg = Int32.Parse(Console.ReadLine());
Console.Write("\n Ingrese Curso"); cur = Int32.Parse(Console.ReadLine());
Console.Write("\n Ingrese ID"); i= Console.ReadLine();
Console.Write("\n Ingrese Domino"); d= Console.ReadLine();
Console.Write("\n Ingrese Tipo de Dominio"); t= Console.ReadLine();
Console.Write("\n Ingrese Contrasea"); c= Console.ReadLine();

Alumno a = new Alumno(reg, nom, cur, i,d,t,c);


lista.insertar(a);
break;
26
Herencia (1)

La herencia es el mecanismo que permite compartir automticamente mtodos y datos


entre clases y subclases. Este mecanismo potente, permite crear nuevas clases a partir de
clases existentes programando solamente diferencias.
Crculo
Si en la definicin de una clase indicamos
que sta deriva de otra, entonces la -radio: real; Clase padre
primera -a la que se le suele llamar clase +circulo.() o base
hija- ser tratada por el compilador +Listar()
+obtenerradio()
automticamente como si su definicin +calcularsuperficie()
incluyese la definicin de la segunda a la
que se le suele llamar clase padre o
clase base.

Cilindro
En este ejemplo, un objeto instancia de la
clase cilindro adems de los miembros de -Altura: real
la clase crculo, tendr un nuevo miembro +cilindro() Clase
(altura) +listar() derivada o
+calcularsuperficie()
hija
27
(*2) Tema 5 Pag. 72

Ejemplo 10

Herencia (2)

class circulo
{
double radio;
public circulo() {}
public circulo(double r){radio=r;}
public double calcularsuperficie(){
return 3.14*radio*radio;
}
public double obtenerradio()
{
return radio;
}
public void Listar(){
{
Console.WriteLine(" Radio:{0,6:f2}", radio);
Console.Write(" Superificie del circulo:{0,6:f2}",
calcularsuperficie());
} }
}

28
(*2) Tema 5 Pag. 72

Ejemplo 10

Herencia (2)

class cilindro : circulo


{double altura;
public cilindro(){} C# ha incluido una palabra reservada
public cilindro(double r, double a) : base(r){ llamada base que devuelve una referencia
altura = a; al objeto actual. Esta referencia es
} semejante a this tiene la peculiaridad de
public double calcularsuperficie() { que los accesos a ella son tratados como si
return 2* 3.14 *obtenerradio() * altura;
}
el verdadero tipo fuese el de su clase base.
public double obteneraltura() {
return altura; Por lo tanto base.listar();
} es equivalente ((circulo)this).Listar();
public void Listar() {
base.Listar();
Console.Write("Altura:{0,6:f2}",altura);
Console.Write(" Superificie del latera del lCilindro:{0,6:f2}",calcularsuperficie());

}
29
Ejemplo 10

Herencia (3)

class Program
{ static void Main(string[] args)
{ float r,a;
Console.WriteLine("Ingrese los datos del circulo");
Console.Write("Radio: ");
r = float.Parse(Console.ReadLine());
circulo cir = new circulo(r);
Console.WriteLine("Ingrese los datos del cilindro");
Console.Write("Radio: ");
r = float.Parse(Console.ReadLine());
Console.Write("Altura: ");
a = float.Parse(Console.ReadLine());
cilindro cil = new cilindro(r, a);
Console.Write("Circulo:\n ");
cir.Listar();
Console.Write("\nCilindro:\n ");
cil.Listar();
int tecla=Console.Read(); }
}
}
30
Herencia (5)
Detalles de programacin

Errores de Warning:

Para evitarlos antepongo la palabra new al prototipo del mtodo:

public new double calcularsuperficie()

public new void Listar()

31
Herencia (6) Detalles de programacin

Qu sucede si el mtodo listar() de la clase derivada lo redefino


como protected o private??

Investigue y formule conclusiones

32
(*2) Pag. 72 El lenguaje de Programacin C# - Jose A. Gonzalez Seco

Herencia (7)

Como vemos, al escribir el constructor de la clase derivada (hija), es necesario hacerlo con
una sintaxis especial que consiste en preceder la llave de apertura del cuerpo del mtodo
con : seguido de una expresin de la siguiente forma:

: base(<parametrosBase>)

A esta estructura se le llama inicializador base y se utiliza para indicar cmo deseamos
inicializar los campos heredados de la clase padre.

Si en la definicin del constructor de alguna clase derivada de otra no incluimos el inicializador


base, el compilador considerar que ste es :base() (sin parmetros). Por ello se debe estar
seguros de que si no se incluye explcitamente base en la definicin de algn constructor, la
clase padre debe disponer de un constructor sin parmetros.

33
Actividad Conjunta 5

class circulo {
double radio; El siguiente ejemplo
public circulo() { muestra una clase circulo
Console.Write("Radio: ");
donde el ingreso de los
radio = double.Parse(Console.ReadLine());
}
atributos se realiza en el
public double calcularsuperficie(){ constructor.
return 3.14 * radio * radio;
Defina la clase cilindro
}
public double obtenerradio() {
correspondiente y realice
return radio; el programa principal
} necesario para probar la
public void Listar() { jerarqua de clases.
Console.WriteLine(" Radio:{0,6:f2}", radio);
Console.Write(" Superificie del Circulo:{0,6:f2}", calcularsuperficie());
}
}

34
Compatibilidad de referencias: Upcasting

Las referencias de la clase base son compatibles con las referencias de


las subclases.
En nuestro caso en particular, las referencias de la clase Circulo son compatibles
con las referencias de la clase Cilindro

Ejemplo
Circulo c1 = new Circulo(3);
Cilindro c2l = new Cilindro(2,5);

c1=c2
PERMITIDO, qu pas en memoria???

c2=c1; // qu pasar??????

35
Compatibilidad y Memoria

Atributos a los que pueden


acceder los
Mtodos de la clase Base

Clase Circulo

Clase Cilindro

Memoria
compatible

36
Vinculacin dinmica vinculacin esttica

Existen mtodos que adems de la vinculacin anticipada (vinculacin en


tiempo de compilacin), permiten la vinculacin dinmica. En este ltimo caso
la vinculacin con el objeto se realiza en tiempo de ejecucin.

Los mtodos que se vinculan tardamente o dinmicamente se denominan


mtodos virtuales. Hay lenguajes como Java, SmallTalk que toman la ligadura
dinmica por omisin, otros, como C#, C++, requieren que el programador
especifique el mtodo como virtual explcitamente.

La vinculacin dinmica (postergada o tarda) tiene la caracterstica de que la


asociacin al mtodo particular depende del objeto al que se enva el mensaje.

En C# la vinculacin dinmica se realiza a travs de las funciones virtuales.

Pro C# 2005 and the .NET 2.0 Plataform Cap. 4 Pg. 146
El Lenguaje de programacin C# Pg. 71 37
Funciones virtuales (1)

Los mtodos virtuales, los cuales se vinculan dinmicamente con el objeto se


denominan tambin funciones virtuales.

C# posee una Tabla de Mtodos (que analizaremos ms adelante). Esta tabla entre
otros contiene una direccin por cada Mtodo Virtual definido en una clase o heredado.

En C# todas las clases heredan implcitamente de la clase System.Object, y como


esta clase tiene distintos mtodos virtuales(por ej. ToString()), toda la clase
tiene asociados mtodos virtuales en la Tabla de Mtodos (TM).

As, los objetos instancias de clases adems de los datos propios de la instancia,
poseen la direccin de la Tabla de Mtodos desde donde se redireccionan los mtodos
virtuales asociados a ella.

Un mtodo debe declararse virtual en la clase en la que aparece por primera vez, y
luego redefinido en las subclases (override).
38
Funciones virtuales (2)

El polimorfismo es la capacidad que tienen objetos de


clases diferentes, relacionados mediante la herencia, a
responder de forma distinta a una misma llamada de un
mtodo.
El polimorfismo se basa en la ligadura dinmica y la
herencia.

Pro C# 2005 and the .NET 2.0 Plataform Cap. 4 Pg. 146
El Lenguaje de programacin C# Pg. 71 39
Funciones virtuales y polimorfismo (1)
p

:circulo :cilindro :circulo :cilindro


:cilindro
Para ver el 6.70 12.50 8.00
funcionamiento del 22.50
4.20

polimorfismo, 0xff050f2b
10
6.15 0xff050f2b
5.30
generamos un 0xff050e01
0xff050e01 0xff050e01
arreglo de
referencias, que
pueda guardar tanto
crculos como
cilindros. TM Cilindro TM Circulo

----------- +-------

--------- ---------

Cilindro.CalcularSuperficie Crculo.CalcularSuperficie

40
cdigo cdigo
Funciones virtuales y polimorfismo (2)
p

:circulo :cilindro :circulo :cilindro


:cilindro
6.70 12.50 8.00
4.20
22.50
0xff050f2b 6.15 0xff050f2b
5.30
10
0xff050e01 0xff050e01
0xff050e01
Sea p una referencia a un
objeto de la coleccin.
Analicemos el resultado de:
TM Cilindro TM Circulo
p.Calcular_Superficie()?
-------- ----------
----------- -----------

Cilindro.CalcularSuperficie Crculo.CalcularSuperficie

41
cdigo cdigo
Funciones virtuales y polimorfismo (3)

Si Calcular_Superficie() es un mtodo esttico, la


invocacin
p.Calcular_Superficie() siempre ejecutar el cdigo asociado
a la clase circulo, an cuando p apunte a un cilindro. Esto se
debe a que p es una referencia a circulo.

42
Funciones virtuales y polimorfismo (4)

Clase Circulo:

namespace PolimorfismoCirculoCilindro{ Por qu Calcular_Superficie() es virtual?


class Circulo{
private double radio;
Por qu mostrarDatos() es virtual?
public Circulo(double r){
radio = r;
}
public virtual void mostrarDatos(){
Console.WriteLine("Radio: {0}", radio);
Console.WriteLine("Superficie: {0}", Calcular_Superficie());
}
public virtual double Calcular_Superficie() {
return Math.PI * Math.Pow(radio, 2);
}
public double obtenerRadio(){
return radio;
}
} 43
Funciones virtuales y polimorfismo (5)

Clase Cilindro:

namespace PolimorfismoCirculoCilindro{
class Cilindro : Circulo{
private double altura;
public Cilindro(double r, double a):base(r) {
altura = a;
}
public override void mostrarDatos() {
base.mostrarDatos();
Console.WriteLine("Altura: {0}", altura);
}
public override double Calcular_Superficie(){
return Math.PI*2*obtenerRadio()*altura
+2*Math.PI*Math.Pow(obtenerRadio(),2);
}
}
} 44
Funciones virtuales y polimorfismo (5)

Cuando se enva el mensaje p.Calcular_Superficie(), en tiempo de


ejecucin no se busca el cdigo asociado al mtodo
p.Calcular_Superficie() en la clase circulo, pues no es un mtodo
esttico.

Como p.Calcular_Superficie() es virtual, desde el objeto obtiene la


direccin de la TM de la clase asociada al objeto y, a partir de la tabla
obtiene la direccin del cdigo asociado al mensaje y lo ejecuta.

Si es un crculo, ejecutar el mtodo p.Calcular_Superficie(), asociado a


la clase circulo, y si es un cilindro ejecutar el mtodo
p.Calcular_Superficie(), asociado a la clase cilindro.

El mismo anlisis vale para el mtodo mostrarDatos()


45
Funciones virtuales y polimorfismo
Ejemplo (1)

Definamos una clase Arreglo, que tiene tres atributos:

items: Un arreglo de referencias a Circulo


tope: entero que indica la posicin donde se puede insertar una referencia
en el arreglo de referencias a circulo.

tamanio: entero que indica el tamao del arreglo. Si la cantidad ingresada


como tamao es <=0 , el tamao es 5.

Es importante hacer notar que cuando el arreglo de referencias a circulo se


llena, se redimensiona con un tamao igual al original mas cinco componentes
ms.

46
Funciones virtuales y polimorfismo
Ejemplo (2)
Sea A un objeto de la clase Arreglo, en tiempo de ejecucin, despus de haber insertado
tres objetos en el arreglo de referencias a circulo, el objeto A se puede representar
grficamente as:

:Arreglo
3
A
7
(items)
Dir. TM Arreglo

:circulo

7 :circulo :cilindro
Dir.TM Circulo 3 5
Dir.TM Circulo 2
DirTM Cilindro 47
Funciones virtuales y polimorfismo
Ejemplo (3)

namespace PolimorfismoCirculoCilindro{
class Arreglo{ public void mostrarElementos(){
private Circulo[] items; int i;
private int tope; for (i = 0; i < tope; i++){
private int tamanio; Console.WriteLine("A[" + i + "]");
public Arreglo(int cantidad){ items[i].mostrarDatos();
if (cantidad > 0) }
tamanio = cantidad; }
else
tamanio = 5; public void mostrarSuperficie(){
items = new Circulo[tamanio]; int i;
tope = 0; for (i = 0; i < tope; i++){
} Console.WriteLine("Superficie de A[{0,1:d}]={1,4:f2}",
public void insertar(Circulo c){ i, items[i].Calcular_Superficie());
if (tope == tamanio){ }
tamanio = tamanio + 5; }
Array.Resize(ref items, tamanio); }
} }
items[tope++] = c;
}
48
arreglo-circulo-cilindro

Funciones virtuales y polimorfismo


Ejemplo (4)

namespace PolimorfismoCirculoCilindro{ case 2:{


class Program{ double radio;
static void Main(string[] args){ double altura;
int opcion = 0; Console.Write("Radio: ");
Arreglo A = new Arreglo(2); radio = double.Parse(Console.ReadLine());
Console.Write("Altura: ");
while (opcion != 5){
altura = double.Parse(Console.ReadLine());
Console.WriteLine("1 - Agregar un circulo"); Circulo cil = new Cilindro(radio, altura);
Console.WriteLine("2 - Agregar un cilindro"); A.insertar(cil);
Console.WriteLine("3 - Listar Atributos"); break;
Console.WriteLine("4 - Listar Superficies"); }
Console.WriteLine("5 - Terminar"); case 3:{
opcion = int.Parse(Console.ReadLine()); Console.WriteLine("Elementos almacenados");
switch (opcion){ A.mostrarElementos();
case 1:{ break;
double radio; }
Console.Write("Radio: "); case 4:{
radio = double.Parse(Console.ReadLine()); Console.WriteLine("Superficie");
A.mostrarSuperficie();
Circulo cir = new Circulo(radio);
break;
A.insertar(cir); }}}}}}
break;
}
49
Funciones virtuales _ Esquema de Memoria

Para el ejemplo anterior, creamos una instancia de cada clase:


Circulo c1 = new Circulo(3);
Cilindro c2 = new Cilindro(2,5)

Pila Heap TM Cilindro

----------------
Dir M.V. mostrarDatos
5 Dir. M. V. Calcular_Superficie
2
Dir TM Cilindro

c2 TM Circulo

3 ----------------
c1
Dir TM Circulo
Dir M.V. mostrarDatos
Dir. M. V. Calcular_Superficie
50
Clase de los objetos referenciados
Operador is: este operador del lenguaje C# permite identificar en tiempo de ejecucin a qu
clase pertenece un objeto referenciado. As, la expresin e is T se evala verdadera si el objeto
referenciado por e pertenece a la clase T

if (c1 is circulo)
Console.WriteLine("c1 pertenece a la clase circulo");
if (c1 is cilindro)
Console.WriteLine("c1 pertenece a la clase cilindro");
else Console.WriteLine("c1 NO pertenece a la clase cilindro");
if (c2 is cilindro)
Console.WriteLine("c2 pertenece a la clase cilindro");
if (c2 is circulo)
Console.WriteLine("c2 SI pertenece a la clase circulo");
Console.WriteLine(asigno a c1=c2");
c1 = c2; //ahora c1 referencia a un objeto de la clase cilindro
if (c1 is circulo)
if (c1 is circulo)
Console.WriteLine("c1 pertenece a la clase circulo");
if (c1 is cilindro)
Console.WriteLine("c1 pertenece a la cilindro");
Console.ReadKey();
}

51
ACTIVIDAD CONJUNTA 6

Para el ejemplo anterior:

Circulo c1 = new Circulo(3);


Cilindro c2l = new Cilindro(2,5);

Realice el seguimiento de este segmento de cdigo.

Investigue Otras opciones:

GetType: es un mtodo que devuelve una referencia a un objeto de la clase System.Type


Operator
typeOf: operador que devuelve una referencia a un objeto de la clase System.Type
52
arreglo-circulo-cilindro

Downcasting: solucin al problema generado por el upcasting


Como las referencias de una coleccin de objetos son referencias a objetos de la clase
base, enviar un mensaje propio de un objeto perteneciente a una subclase dar un error
en tiempo de compilacin.
Para esto es necesario hacer la conversin explcita correspondiente a travs de un cast
(downcasting), sino los nicos mtodos que se pueden usar son los de la clase base.
Suponiendo que la clase cilindro tiene un mtodo propio calcularVolumen() que es
esttico, si se desea mostrar el volumen de cada uno de los cilindros se deben llevar a
cabo los siguientes pasos:
1) Por cada items del arreglo preguntar si es cilindro
2) Si es cilindro, antes del enviar el mensaje calcularVolumen() se debe hacer downcast para
transformarlo a cilindro

if (items[i] is Cilindro)
Console.WriteLine( ((Cilindro)items[i]).Calcular_Volumen());

53
circulo-cilindro-volumen

Actividad Conjunta 7

ACTIVIDAD:
Agregue al ejemplo de la clase Arreglo los mtodos necesarios para
dar respuesta a las siguientes opciones:
Mostrar la cantidad de crculos y cilindros del arreglo
Indicar la cantidad de cilindros con mxima superficie
Mostrar el volumen de cada uno de los cilindros, sabiendo que el
volumen es:
Volumen = superficie de la base * altura

54
Clase Abstracta

Como es conocido, las clases abstractas no son instanciables. Se utilizan para proporcionar
comportamiento comn a las subclases. Para definir una clase abstracta en C# se antepone
abstract a su definicin.

EMPLEADO
public abstract class EMPLEADO
{

DOCENTE ADMINISTRATIVO
abstract public class EMPLEADO
{

NO_PROFESIONAL PROFESIONAL

55
Clase Abstracta Mtodos abstractos (1)

La utilidad de las clases abstractas radica en que pueden contener mtodos que no
proporcionan una implementacin, la cual se deja en manos de sus clases derivadas. Estos
mtodos se llaman mtodos abstractos y se definen precediendo su definicin del modificador
abstract y sustituyendo su cdigo por un punto y coma (;) .

Un mtodo abstracto es un mtodo virtual que permite declarar un comportamiento comn a las
subclases de la clase donde se defini, el cual ser redefinido en cada una de ellas.

Una clase que contiene al menos un mtodo abstracto (an cuando contenga mtodos concretos)
debe declararse como abstracta.

Una clase concreta derivada de una clase abstracta debe proporcionar implementacin a los
mtodos abstractos para eso el mtodo de la subclase debe incluir el modificador override.

56
Clase Abstracta Mtodos abstractos (2)
ALUMNO

- string nombre;
- string carrera;
- long ingreso;
+ALUMNO()
+ abstract long permanencia();
+ long get_ingreso()
+ void mostrar()

EGRESADO REGULAR
- long egreso; - int aprobadas

+ EGRESO()
+ override long permanencia(); + REGULAR(.)
+ override long permanencia();

57
Ejemplo 13

Clase Abstracta Mtodos abstractos (3)

abstract class ALUMNO{


string nombre,carrera;
long ingreso;
public ALUMNO(string nn, string car, long ing){
nombre=nn;
carrera=car;
ingreso=ing;
}
abstract public long permanencia();
public long get_ingreso() {
return ingreso;
}
public void mostrar() {
Console.WriteLine("Nombre:{0} Permanencia: {1}", nombre, permanencia()); }
}
class EGRESADO : ALUMNO {
long egreso;
public EGRESADO(string nn, string car, long ing, long egr): base(nn, car, ing) {
egreso = egr;
}
public override long permanencia() {
return egreso - get_ingreso();
} 58
}
Ejemplo 13

Clase Abstracta Mtodos abstractos (4)

class REGULAR : ALUMNO {


int aprobadas;
public REGULAR(string nn, string car, long ing, int apr) : base(nn, car, ing)
{ aprobadas = apr;
}
public override long permanencia(){
return DateTime.Now.Year - get_ingreso();
}
}
class Program {
static void Main(string[] args)
{ EGRESADO e = new EGRESADO("Juan", "Geologa", 1999, 2005);
Console.WriteLine("Aos de Permanencia del Egresado: " + e.permanencia());
REGULAR r = new REGULAR("Ana", "Astronoma", 2006, 14);
Console.WriteLine("Aos de Permanencia del Regular: " + r.permanencia());
Console.ReadKey();
Console.WriteLine("***** Resultado de enviar el mensaje mostrar ****");
e.mostrar();
r.mostrar(); Salida:
Console.ReadKey(); Aos de Permanencia del Egresado: 6
Aos de Permanencia del Regular: 3
}
** Resultado de enviar el mensaje mostrar**
}
Nombre: Juan Permanencia: 6 59
} Nombre: Ana Permanencia: 3
Mtodos Virtuales y Polimorfismo
Conclusiones

En este ejemplo el mtodo Mostrar() es esttico y est en la clase superior.


Esto muestra una de las ventajas del polimorfismo, tal es permitir la
reusabilidad de cdigo.
En la jerarqua circulo cilindro el mtodo mostrarDatos() se define en la
clase padre y la clase hija como virtual. Por qu??

60
ACTIVIDAD CONJUNTA 8 (1)

Un prisma es un slido determinado por dos polgonos paralelos y


congruentes (bases) y por tantos paralelogramos como lados tengan las
bases (caras)

Atributos:
lado, altura del tringulo y altura del prisma
Prisma triangular
Superficie: ---
Volumen: Superficie de la base * altura

Una pirmide es un slido limitado por una base que es un polgono


cualquiera; y por caras, que son tringulos coincidentes en un punto
denominado pice.
Atributos:
Lado del cuadrado y altura de la pirmide

Superficie: ---
Pirmide cuadrangular Volumen: Superficie de la base * altura/3
61
ACTIVIDAD CONJUNTA 8 (1)

Genere una coleccin de prismas triangulares y pirmides cuadrangulares y responda al


siguiente men:

1. Indicar los datos del prisma de mayor volumen


2. Indicar los datos de la pirmide de mayor volumen
3. Mostrar datos de los prismas
4. Mostrar datos de las pirmides
5. Mostrar los datos del slido de mayor altura.

62
La Clase System.Object (1)

En .NET todos los tipos que se definan heredan implcitamente de la clase


Object predefinida en la BCL, por lo que dispondrn de todos los miembros de sta.

Object es la raz de la jerarqua de objetos de .NET por lo cual se dice que es la


clase base directa o indirecta de todas las clases

Todas las clases heredan los siete mtodos de la clase System.Object

63
La Clase System.Object (2)
Equals Sobrecargado. Determina si dos instancias de Object son iguales.

Finalize Permite que un objeto Object intente liberar recursos y realizar otras
operaciones de limpieza antes de que el objeto Object sea reclamado por
el recolector de elementos no utilizados.

GetHashCode Acta como funcin hash para un tipo concreto.

GetType Obtiene el objeto Type de la instancia actual.

MemberwiseClone Crea una copia superficial del objeto Object actual.

ReferenceEquals Determina si las instancias de Object especificadas son la misma


instancia.

ToString Devuelve una clase String que representa la clase Object actual.

64
La Clase System.Object (3)
(*2) Captulo 5 - Pag. 67 El lenguaje de Programacin C#
(*5) Captulo 3 Pg. 104 Professional C#
Mtodo Equals: (*4) Deitel y Deitel Pg. 338

1) public virtual bool Equals(object o): Se usa para comparar el objeto sobre el que se
aplica Equals con cualquier otro que se le pase como parmetro. Devuelve true si ambos
objetos son iguales y false en caso contrario.

Ejemplo: Son iguales


circulo cir = new circulo(3);
circulo cir1 = new circulo();
cir1 = cir;
if (cir.Equals(cir1)) Console.Write("\nson iguales:\n ");
else Console.Write("\nson distintos:\n ");

En este caso hemos considerado que dos crculos son iguales si ambos apuntan a la
misma referencia en memoria dinmica (igualdad por referencia)

65
La Clase Object (4)
(*2) Captulo 5 - Pag. 67 El lenguaje de Programacin C#
(*5) Captulo 3 Pg. 104 Professional C#
Mtodo Equals:

Por ser virtual, en cada clase puede redefinirse el mtodo Equals para indicar cuando dos objetos
de una clase son iguales.

Toda redefinicin del mtodo Equals() que hagamos cumple con una serie de propiedades que
muchos de los mtodos incluidos en las distintas clases de la BCL esperan que se cumplan:
Reflexividad, Simetra, Transitividad, Consistencia y tratamiento de objetos nulos. (Ver Bibliografa)

Por ejemplo podemos redefinir el mtodo Equals, suponiendo que dos objetos de la clase circulo
son iguales cuando tienen el mismo radio, aunque apunten a distinta rea de memoria dinmica.

cir cir1

8 8
Dir. T.M. Dir. T.M

66
(*2) Captulo 5 - Pag. 67 El lenguaje de Programacin C#
(*5) Captulo 3 Pg. 104 Professional C#

La Clase System.Object (5)


Mtodo Equals:
public override bool Equals(object o)
{
if (o == null) // tratamiento de objetos nulos
return this == null;
else return (o is circulo) && (this.radio == ((circulo)o).radio);
}
}

Redefinir Equals() no implica que el operador de igualdad (==) quede tambin redefinido

Ejemplo: Son iguales


circulo cir = new circulo(8);
circulo cir1 = new circulo(8);
if (cir.Equals(cir1)) Console.Write("\nson iguales:\n ");
else Console.Write("\nson distintos:\n ");

67
(*2) Captulo 5 - Pag. 67 El lenguaje de Programacin C#
(*5) Captulo 3 Pg. 104 Professional C#

La Clase System.Object (6)


Mtodo Equals: Versin esttica

2) public static bool Equals(object objeto1, object objeto2):


Indica si los objetos que se le pasan como parmetros son iguales, y para compararlos lo que
hace es devolver el resultado de calcular objeto1.Equals(objeto2) comprobando antes si
alguno de los objetos vale null (slo se devolvera true slo si el otro tambin lo es)

Ejemplo: Son iguales


circulo cir = new circulo(8);
circulo cir1 = new circulo(8);
if (Equals(cir,cir1)) Console.Write("\nson iguales:\n ");
else Console.Write("\nson distintos:\n ");

Por ser Equals static no es necesario hacer referencia a un objeto de la clase

68
(*2) Captulo 5 - Pag. 67 El lenguaje de Programacin C#
(*5) Captulo 3 Pg. 104 Professional C#

La Clase System.Object (7)


Mtodo ToString:

Este mtodo devuelve un string que representa a un objeto.


Una aplicacin llama implcitamente a este mtodo cada vez que un
objeto debe convertirse en una representacin string (Ej. El mtodo Write
de Console).

Este mtodo generalmente se redefine por una clase derivada para


especificar una representacin string apropiada de los datos en un objeto
de la clase derivada.

69
(*2) Captulo 5 - Pag. 67 El lenguaje de Programacin C#
(*5) Captulo 3 Pg. 104 Professional C#

La Clase System.Object (8)


Mtodo ToString:

3) public virtual string ToString(): Devuelve una representacin en forma de cadena del
objeto sobre el que se el mtodo es aplicado.

int i=-50;
string s=i.ToString(); // retorna -50

La implementacin por defecto de este mtodo simplemente devuelve una cadena de texto
con el nombre de la clase a la que pertenece el objeto sobre el que es aplicado.

Ejemplo:
circulo cir = new circulo(8);
Console.Write("\ncir.ToString() + cir.ToString()); Herencia.circulo

Espacio de nombre Nombre de la clase

Lo habitual suele ser redefinir ToString() en cada nueva clase de modo de mostrar con ms70
facilidad el estado de los objetos
(*2) Captulo 5 - Pag. 67 El lenguaje de Programacin C#
(*5) Captulo 3 Pg. 104 Professional C#

Ejemplo13_bis

La Clase System.Object (9)


Mtodo ToString:
public void mostrar()
{ Console.WriteLine("Nombre: {0} Permanencia: {1}", nombre, permanencia());
}

public override string ToString() {


string cadena = "";
cadena = "Nombre" + nombre + "Permanencia" + permanencia().ToString() + "\n";
return cadena;
}
static void Main(string[] args)
{
EGRESADO e = new EGRESADO("Juan", "Geologa", 1999, 2005);
.
REGULAR r = new REGULAR("Ana", "Astronoma", 2006, 14);
..
Console.Write(e.ToString());

Console.Write( r.ToString());
71
}
El Lenguaje de programacin C# Pg. 127 a 132

Propiedades

Una propiedad es una mezcla entre el concepto de campo y el concepto de


mtodo.
Externamente es accedida en forma directa como si se tratase de un campo.
Internamente se escribe el cdigo de acceso para el atributo que representa,
este cdigo permite tomar su valor o cambiarle el valor.

Definicin de propiedades:
<tipoPropiedad> <nombrePropiedad>{
set{
<cdigoEscritura>
}
get{
<cdigoLectura>
}
}
72
Propiedades

Ejemplo Propiedades (1)

class Empresa public string Denominacion{


get{ return denominacion;
{
}
private string denominacion;
set{denominacion = value;
private string domicilio; }
private string telefono; }
public string Domicilio{
public Empresa(string den, string dom, string tel) { get{return domicilio;
denominacion = den; }
domicilio = dom; set{domicilio = value;
telefono = tel; }
} }
public Empresa() {} public string Telefono{
public void mostrarDatos() { get{ return telefono;
Console.WriteLine("Denominacin: {0}", denominacion); }
Console.WriteLine("Domicilio: {0}", domicilio); set{telefono = value;
Console.WriteLine("Telfono: {0}", telefono); }
}
}
}
73
Propiedades

Ejemplo Propiedades (2)

class Program {
static void Main(string[] args) {
string a, b, c;
Console.WriteLine("Ingrese Denominacin \n "); a = Console.ReadLine();
Console.WriteLine("Ingrese Domicilio \n" ); b = Console.ReadLine();
Console.WriteLine("Telfono \n "); c= Console.ReadLine();
Empresa e = new Empresa(a, b, c);
e.mostrarDatos();
/// Modifico la denominacin
e.Denominacion="La Positiva";
e.mostrarDatos();
/// uso propiedades directamente
Empresa f= new Empresa();
Console.WriteLine("Ingrese Denominacin \n "); f.Denominacion = Console.ReadLine();
Console.WriteLine("Ingrese Domicilio \n"); f.Domicilio = Console.ReadLine();
Console.WriteLine("Telfono \n "); f.Telefono = Console.ReadLine();
Console.ReadKey();
}
}
74
La biblia de C# p. 301
Pro C# 2005 and the .NET 2.0 Plataform Cap. 7 Pg. 221
El Lenguaje de programacin C# Pg. 171

Interfaces (1)

Una interfaz es un conjunto de firmas de mtodos, propiedades, eventos o


indizadores agrupados bajo un nombre comn (no poseen modificador de acceso, por
defecto son pblicas).

No pueden contener: atributos, operadores, constructores, destructores ni


miembros estticos.

Funcionan como un conjunto de funcionalidades que luego implementan las clases.


Son parecidas a las clases abstractas, en el sentido en que no proveen implementacin
de los mtodos que declaran.

Se diferencian en que las clases que derivan de clases abstractas pueden no


implementar los mtodos abstractos (subclase abstracta), mientras que las clases que
implementen una interfaz deben proveer implementacin de todos los
mtodos de la interfaz.

75
La biblia de C# p. 301
Pro C# 2005 and the .NET 2.0 Plataform Cap. 7 Pg. 221
El Lenguaje de programacin C# Pg. 171

Interfaces (2)

Al igual que las clases abstractas, son tipo referencia, pero no pueden crearse objetos
directamente de ellas (solo de las clases que las implementen).

Las clases pueden implementar cualquier nmero de interfaces (no confundir con herencia
mltiple)

Una clase que implementa una interfaz, provee implementacin a todos los mtodos de la
interfaz.

Definicin de Interface
Sintaxis: <modificadores> interface <nombre>{ <miembros> }

Los <modificadores> son los mismos que los de las clases (public, protected, private, internal)
Los miembros de la interface pueden ser:Mtodos, Propiedades, Indizadores, Eventos

76
(*4) deite y deitel Pg. 365

Interfaces (3) Jerarqua Interfaz y clases que la implementan

public interface IPorPagar{


double ObtenerMontoPago();
} <<inteface>>
IPorPagar
Factura y Empleado representan clases
para las cuales una compaa debe
calcular un monto a pagar.
Por lo tanto ambas clases implementan
el mtodo IPorPagar.

Factura Empleado

EmpleadoAsalariado

Una clase realiza o implementa a una interfaz. 77


Ejemplo - Interfaces (1)

Definiremos una Interfaz, con los mtodos LeerDatos y GuardarDatos, a la que


llamaremos Ipersistencia.

El objetivo de esta interfaz ser proveer la firma de los mtodos que debern
implementar las clases que requieran proveer una forma de persistencia para los
objetos.

Ntese la libertad que deja la interfaz, de modo que una clase que la implemente
podr guardar/leer los datos en un archivo de texto, en un archivo binario, o en
una base de datos, todo depender de la implementacin que realice de los
mtodos LeerDatos y GuardarDatos.

public interface IPersitencia{


bool LeerDatos();
bool GuardarDatos();
} 78
Ejemplo Interfaces (2)
Dada la Clase Persona, proveeremos una coleccin de objetos basada en un
arreglo que implementar la intefaz IPersistencia
class Persona{
private int nro;
private string nombre;
private string apellido;
public Persona(int nro, string apellido, string nombre){
this.nro = nro;
this.nombre = nombre;
this.apellido = apellido;
}
public int getNro(){return nro;}
public string getNombre(){return nombre;}
public string getApellido() { return apellido; }
override public string ToString()
{
return nro.ToString() + "-" + this.apellido+"-"+this.nombre;
} 79
}
Ejemplo - Interfaces (3)

class ArregloPersonas : IPersitencia{


private Persona[] datos;
private int tope = 0;
public ArregloPersonas(int n){
datos = new Persona[n];
}
public void insertar(Persona p){
try{
datos[tope++] = p;
}
catch (IndexOutOfRangeException e){
Console.WriteLine("Indice del arreglo fuera de rango, no se pudo insertar ltimo elemento");
tope--;
}
}

80
Ejemplo Interfaces (4)
public bool LeerDatos(){ //implementacin del mtodo declarado en la Interfaz
bool resultado = true;
try
{ StreamReader entrada = new StreamReader("personas.txt");
while (!entrada.EndOfStream)
{ string linea = entrada.ReadLine();
string[] arreglo = linea.Split('-');
Persona p = new Persona(int.Parse(arreglo[0]), arreglo[1], arreglo[2]);
this.insertar(p);
}
entrada.Close();
}
catch (Exception e)
{
resultado = false;
Console.WriteLine("Error de Entrada/Salida {0}", e.Message);
}
return resultado;
} 81
ejemplo_persistencia1

Ejemplo Interfaces (5)


public bool GuardarDatos(){ //implementacin del mtodo declarado en la Interfaz
bool resultado = true;
try{ StreamWriter salida = new StreamWriter("personas.txt");
for (int i = 0; i < tope; i++){
salida.WriteLine(datos[i].ToString());
}
salida.Close();
} catch (Exception e){
resultado = false;
Console.WriteLine("Error de Entrada/Salida {0}",e.Message);
}
return resultado;
}
public void mostrarDatos(){
for (int i = 0; i < tope; i++){
Persona p = datos[i];
Console.WriteLine(p.ToString());
}
} 82
Ejemplo Interfaces (6)
class Program
{ static void Main(string[] args)
{ int i,num;
string s1, s2;
Console.WriteLine("Ingrese cantidad de Personas");
int cant = Convert.ToInt32(Console.ReadLine());
ArregloPersonas a = new ArregloPersonas(cant);
for (i = 0; i < cant; i++) {
Console.Write("Ingrese numero: "); num = Convert.ToInt32(Console.ReadLine());
Console.Write("Ingrese Apellido: "); s1 = Console.ReadLine();
Console.Write("Ingrese Nombre: "); s2 = Console.ReadLine();
Persona p = new Persona(num, s1, s2);
a.insertar(p);
}
Console.WriteLine("Datos Guardados en el arreglo");
a.mostrarDatos();
if (a.GuardarDatos())
Console.WriteLine("Los datos fueron guardados con xito en el Stream");
Console.ReadKey();
}
} 83
}
Ejemplo Interfaces (7)
class Program
{
static void Main(string[] args)
{
int i,num;
string s1, s2;
Console.WriteLine("Ingrese cantidad de Personas");
int cant = Convert.ToInt32(Console.ReadLine());
ArregloPersonas a = new ArregloPersonas(cant);
Console.WriteLine("Leer Datos Guardados en el Stream");
if (a.LeerDatos())
Console.WriteLine("Los datos fueron recuperados con xito en el
Stream");
a.mostrarDatos();
Console.ReadKey();
}
}
}
84
Colecciones (Collections 1)

Para utilizar una coleccin de objetos, que pertenecen a una misma jerarqua,
se necesita que las referencias sean todas del tipo base (las ms genrica de
todas: referencias a Object)

Arreglo de objetos // analizado anteriormente

Colecciones de objetos

Colecciones (provistas por el lenguaje)

85
Pro C# 2005 and the .NET 2.0 Plataform Cap. 7 Pg. 250

Colecciones (Collections 2)

Una coleccin es un contenedor que guarda un conjunto de objetos.

En el Framework .NET existen varias implementaciones para las


colecciones.

Adems existen interfaces estndar para enumerar, comparar y crear


nuevas colecciones.
Colecciones del espacio de nombres System.Collections
ArrayList
HashTable
Queue
Stack

86
ArrayList (1)
Un ArrayList, es similar a un arreglo, la diferencia radica en que el ArrayList puede
crecer en tiempo de ejecucin.

Se lo puede instanciar indicando la capacidad inicial


ArrayList vector = new ArrayList(20);

Si no se indica la capacidad inicial, toma el valor por defecto 16 para el tamao


inicial:
ArrayList vector = new ArrayList();

Un ArrayList trata a todos sus elementos como referencias a objetos de la clase


System.Object

87
ArrayList (2)

Para agregar nuevos elementos se utilizan los mtodos:


Add: agrega un elemento al final del ArrayList
Insert: agrega un elemento en la posicin especificada.

Ejemplo:
ArrayList v1 = new ArrayList();
v1.Add(Luis);
v1.Insert(1,Jos)
V1.Insert(2,23);

88
Propiedades y Mtodos de ArrayList

Mtodo / Propiedad Funcin

Capacity Indica la capacidad actual de la coleccin (cuantos elementos puede


contener)
Count Cantidad actual de elementos de la coleccin

Add() Aade un objeto al final de la coleccin

Insert() Inserta un objeto a la coleccin en la posicin indicada

Clear() Elimina todas las referencias de la coleccin (limpia la coleccin)

Sort() Ordena la coleccin (ojo para usar este mtodo la clase debe
implementar la interface IComparable y refinir el mtodo
CompareTo)
GetEnumerator() Obtiene un enumerador a partir de la coleccin, y este enumerador sirve
para recorrer la coleccin, obtener el elemento actual de enumerador, etc.

89
array_list_clientes

Ejemplo ArrayList(1)

using System;
using System.Collections.Generic; public float Saldo{
using System.Collections; get { return saldo; }
using System.Linq; set { saldo = value; }
using System.Text; }
namespace array_list_clientes public int NumeroCuenta {
public class Cuenta{ get { return numeroCuenta; }
private float saldo; set { numeroCuenta = value; }
private int numeroCuenta; }
public Cuenta(int nc, float s){ public virtual void mostrarDatos(){
Console.WriteLine("Cuenta Nmero: {0}", this.numeroCuenta);
saldo=s;
numeroCuenta=nc; Console.WriteLine("Saldo: {0}", this.saldo);
} }
public Cuenta(){ }
saldo = 0.0f; }
numeroCuenta = 0;
}

90
array_list_clientes

Ejemplo ArrayList(2)
public class Cliente{
Ejemplo ArrayList(2)
int numeroCliente;
string apellidoyNombre;
public float obtenerSaldoCuenta(int nc)
{
ArrayList cuentas=new ArrayList(10); bool bandera = false;
public Cliente(){ int i=0;
numeroCliente = 0; Cuenta c;
} float saldo = -1.0f;
public Cliente(int nroCli, string AyN){ while (!bandera && i < cuentas.Count){
numeroCliente = nroCli; c = (Cuenta)cuentas[i]; //downcasting
apellidoyNombre = AyN; if (c.NumeroCuenta == nc){
} bandera = true;
public int NumeroCliente { saldo = c.Saldo;
get { return numeroCliente; } }
set { numeroCliente = value; } i++;
} }
if (!bandera){
public string ApellidoyNombre{
Console.WriteLine("Cuenta {0} inexistente", nc);
get { return apellidoyNombre; }
Console.WriteLine("Presione Enter");
set { apellidoyNombre = value; } Console.ReadKey();
} }
public void nuevaCuenta(Cuenta c){ return saldo;
cuentas.Add(c); }
} }
}

91
array_list_clientes

Ejemplo ArrayList(3)
class Program
{
static void Main(string[] args)
{
Cliente clienteBanco = new Cliente(1001, "Andrea Luque");
int opcion = 0;
do
{ Console.WriteLine("\n Men Clientes Banco");
Console.WriteLine("1 - Crear Cuenta Cliente");
Console.WriteLine("2 - Obtener saldo de cuenta de Cliente");
Console.WriteLine("5 - Salir");
opcion = int.Parse(Console.ReadLine());
switch (opcion)
{ case 1:
{Console.Write("Nmero de Cuenta: ");
int numeroCuenta = int.Parse(Console.ReadLine());
Console.Write("Saldo: ");
float saldo = float.Parse(Console.ReadLine());
Cuenta cuentaCliente = new Cuenta(numeroCuenta, saldo);
clienteBanco.nuevaCuenta(cuentaCliente);
}
break; 92
array_list_clientes

Ejemplo ArrayList(4)

case 2:
{
Console.Write("Nmero de Cuenta: ");
int numeroCuenta = int.Parse(Console.ReadLine());
Console.WriteLine(clienteBanco.ApellidoyNombre + " tiene en la cuenta " + numeroCuenta + " un saldo de $"
+ clienteBanco.obtenerSaldoCuenta(numeroCuenta));
}
break;
}
} while (opcion != 5);
}
}
}

93
ACTIVIDAD CONJUNTA 9

Utilice las clases Cuenta y Cliente antes definida y genere una coleccin de clientes de
un banco.
Realice un programa que responda al siguiente men de opciones:
1: Insertar un cliente
2: Mostrar el total de cuentas de cada uno de los clientes
3: Listar monto total acumulado de cada uno de los clientes
4: Dado el nombre de un cliente, mostrar los saldos de cada una de sus cuentas.
5: Eliminar un cliente.
6: Mostrar datos de todos los clientes
7: Salir

94

Potrebbero piacerti anche