Post on 10-Sep-2015
description
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
1
Programacin Orientada
a Objetos en C#
Autor:Dr. Ramn Roque Hernndezhttp://ramonroque.com/Materias/pooTec.htmramonroque@yahoo.com
Colaborador:Ing. Bruno Lpez Takeyas, M.C.www.itnuevolaredo.edu.mx/takeyastakeyas@itnuevolaredo.edu.mx
Unidad 3.- Herencia
2
Relaciones entre clases:
Herencia, Composicin
y Agregacin
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
3
4
Herencia
Caracterstica de la POO que permitedefinir nuevas clases a partir de otrasya existentes.
Las clases existentes transmiten suscaractersticas.
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
5
Herencia (cont.)
Puede usarse para: Relaciones del tipo es un
Ejemplo: Un Gerente es un Empleado con caractersticas propias adicionales.
Objetivo: Reutilizacin de cdigo.
6
Herencia
Lavadora
Aparato_Electrodomestico
(Propiedades:Interruptor, CableElectrico
Mtodos:Encender, Apagar)
Propiedades:(Interruptor, CableElectrico,
PerillaDeCiclosDeLavado, CapacidadDeCarga) Mtodos:
(Encender, Apagar,LlenarConAgua, TirarAgua)
Propiedades:(Interruptor, CableElectrico,
BotonDeCanales, BotonDeVolumen) Mtodos:
(Encender, Apagar,CambiarVolumen, CambiarCanal)
Televisin
Herendan caractersticas de Aparato_Electrodomestico
e incorporan las suyas propias.
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
7
Uso de la Herencia
Beneficios: Permte escribir menos cdigo. Mejora la reusabilidad de los componentes. Facilita el mantenimiento del sistema completo.
Util para un buen diseo del programa.
Un diseo pobre sin herencia implementara las clases involucradas de manera independiente.
8
Herencia en C#
En C# solo se permite Herencia simple.
Ejemplo de Herencia en C#
class A{}class B : A{}
Todos los objetos heredan de System.Object
Indica que B Hereda de A
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Ejemplo de herencia
9
class Persona{.
}
class Empleado:Persona{.
}
class Estudiante:Persona{.
}
class Profesor:Empleado{.
}
class Administrador:Empleado{.
}
1010
Ejercicio
Se deben modelar dos clases con las siguientes caractersticas:
Automovil
CaballosDeFuerza: intCantidadDePuertas: int
Arrancar() : voidDetener() : voidAcelerar(int cuanto): void
PalaMecanica
CaballosDeFuerza: intPesoMaximoDeLevante: int
Arrancar() : voidDetener() : voidMoverPala(string direccion) : void
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
1111
Mal Diseo
(No recomendable)
Modelarlas de manera independiente.class Automovil{
private int cf, cp;public int CaballosDeFuerza{
get { return cf; }set { cf = value; }
}public int CantidadDePuertas{
get { return cp; }set { cp = value; }
}public void Arrancar(){}public void Detener(){}public void Acelerar(int cuanto){}
}
class PalaMecanica{
private int cf, pml;public int CaballosDeFuerza{
get { return cf; }set { cf = value; }
}public int PesoMaximoDeLevante{
get { return pml; }set { pml = value; }
}public void Arrancar(){}public void Detener(){}public void MoverPala(string direccion){}
}
Iguales
Iguales
Iguales
1212
Diseo usando Herencia
(Recomendado)
Vehiculo
CaballosDeFuerza : int
Arrancar() : voidDetener() : void
Automovil
CantidadDePuertas : int
Acelerar(int cuanto) : void
PalaMecanica
PesoMaximoDeLevante : int
MoverPala(string direccion) : void
Superclase(Clase base)(Clase padre)(Clase madre)
Subclases(Clases derivadas)(Clases Hijas)
Herencia
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
1313
Diseo de las clases usando
herencia en C#class Vehiculo{
private int cf;public int CaballosDeFuerza{
get { return cf; }set { cf = value; }
}public void Arrancar(){}public void Detener(){}
}
class Automovil : Vehiculo{ private int cp;
public int CantidadDePuertas{ get { return cp; }
set { cp = value; }}public void Acelerar(int cuanto){}
}
class PalaMecanica : Vehiculo {
private int pml;public int PesoMaximoDeLevante{
get { return pml; }set { pml = value; }
}public void MoverPala(string direccion){}
}
1414
Notas sobre el ejemplo
Todas las variables, mtodos y propiedades que no sean privadas, sern heredadas.
Los elementos heredados se accesan igual que si estuvieran presentes en esa clase.
class Programa{
static void Main(){
Automovil unAuto = new Automovil();unAuto.Arrancar();unAuto.Acelerar(10);unAuto.Detener();PalaMecanica unaPala = new PalaMecanica();unaPala.Arrancar();unaPala.MoverPala ("arriba");unaPala.Detener();System.Console.ReadLine();
}}
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
15
Llamando mtodos de la
clase base
Una subclase puede llamar los mtodos de su superclase con la palabra reservada base.
class Vehiculo{ public void Arrancar()
{ System.Console.WriteLine("....Arrancando....Clase Vehiculo... ");}
}class Automovil : Vehiculo{ public void Acelerar(int cuanto)
{ System.Console.WriteLine("Primero, hay que arrancar");base.Arrancar();System.Console.WriteLine("Despues, hay que acelerar...");System.Console.WriteLine("Acelerando "+ cuanto + " km/hr");
} }class Programa{ static void Main()
{ Automovil miCarro = new Automovil();miCarro.Acelerar(10);System.Console.ReadLine();
}}
16
class A{ public A()
{ System.Console.WriteLine(" Constructor de la clase A");}
}class B : A{ public B()
{ System.Console.WriteLine(" Constructor de la clase B");}
}class C : B{ public C()
{ System.Console.WriteLine(" Constructor de la clase C ");}
}class programa{ static void Main()
{ C miObjetoC = new C();}
}
Secuencia de ejecucin de
constructores en la Herencia
Considerar el siguiente ejemplo Qu salida se obtiene?
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
17
Secuencia de ejecucin de
constructores en la Herencia
Constructor de la clase AConstructor de la clase BConstructor de la clase C
Salida del programa
Al crear una instancia de C, Primero se ejecuta el constructor de la
clase padre (Que en realidad siempre es Object), luego el constructor de la clase A, despus el constructor de la clase B, y finalmente el constructor de la
clase C
System.Object
A
B
C
18
Secuencia de ejecucin de los
destructores usando herencia
class A{ public A()
{ System.Console.WriteLine("Constructor de la clase A");}~A(){ System.Console.WriteLine("Destructor de la clase A");}
}class B : A{ public B()
{ System.Console.WriteLine("Constructor de la clase B");}~B(){ System.Console.WriteLine("Destructor de la clase B");}
}class C : B{ public C()
{ System.Console.WriteLine("Constructor de la clase C ");}~C(){ System.Console.WriteLine("Destructor de la clase C");}
}
class programa{
static void Main(){
C miObjetoC = new C();miObjetoC = null;GC.Collect();Console.ReadKey();
}}
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
19
Secuencia de ejecucin de los
destructores usando herencia
Constructor de la clase AConstructor de la clase BConstructor de la clase CDestructor de la clase CDestructor de la clase BDestructor de la clase A
La salida del programa es
Los destructores son invocados en orden inverso a
los constructores.
20
Invocando constructores de
la clase baseclass Punto{
public int x, y;public Punto(int puntoX, int puntoY){ x = puntoX;
y = puntoY;}
}class Circulo : Punto{
public double r;public Circulo(int coordX, int coordY, double radio)
:base (coordX, coordY){
r = radio;}public string ConsultarDatos(){
return string.Format("X={0} Y={1} R ={2} ",x,y,r);}
}class Programa{
public static void Main(){
Circulo c = new Circulo(1, 2, 1);System.Console.WriteLine(c.ConsultarDatos());System.Console.ReadLine();
}}
X=1 Y=2 R =1
La salida del programa es
La palabra reservada base( ) hace referencia a la clasepadre inmediata desde la
cual se invoca.Entre parntesis se
especificanlos parmetros requeridos.
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
21
Evitando la herencia:
Clases sealed
Las clases sealed (selladas) pueden ser instanciadas pero NO heredadas.
Se utiliza la palabra sealed para indicarlo.
Usar sealed simultneamente con abstract produce un error.
class Persona{ private string _nombre;
public string Nombre{ get { return _nombre; }
set { _nombre = value; }}
}sealed class Empleado : Persona{ private string _departamento;
public string Departamento{ get { return _departamento; }
set { _departamento = value; }}
}class EmpleadoTiempoParcial:Empleado { private int _horasAsignadas;
public int HorasAsignadas{ get { return _horasAsignadas; }
set { _horasAsignadas = value; }}
}
ERROR!
Clases parametrizadas o
genricas
Ejemplo: Una empresa y una escueladesean almacenar la clave y nombre desus personas: Clave: Entero String Nombre: String
Pero en la empresa la clave esnumrica entera y en la escuela es unacadena.
22
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Clases parametrizadas o
genricas (cont.)
Clases iguales (excepto en el tipo de dato de la clave)
23
Escuela
Empresa
Clases parametrizadas o
genricas (cont.)
Disear una clase parametrizada quesirva para ambos casos:
24
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Codificacin de la clase
parametrizadaclass Persona // Clase parametrizada o genrica
{
// Atributos privados
private Tipo clave; // Se define el tipo de dato de la clave
private string nombre;
// Propiedades pblicas
public Tipo Clave // Se define el tipo de dato de la propiedad
{
get { return clave; }
set { clave = value; }
}
public string Nombre
{
get { return nombre; }
set { nombre = value; }
}
}25
Clases parametrizadas o
genricas (cont.)
// Declaracin y creacin de los objetos
Persona Empleado = new Persona();
Persona Estudiante = new Persona();
// Uso de los objetos
Empleado.Clave = int.Parse(txtClave.Text);
Estudiante.Clave = txtClave.Text;
26
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Clases parametrizadas con
varios tipos
Ejemplo: Una empresa y una escueladesean almacenar la clave y grupo desus personas: Clave: Entero String Nombre: Entero caracter
27
Clases parametrizadas con
varios tipos
Clases iguales (excepto en los tipos de datos)
28
Escuela
Empresa
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Codificacin de la clase
parametrizada con varios tipos
class Persona // Clase parametrizada con varios tipos
{
// Atributos privados
private Tipo1 clave;
private Tipo2 grupo;
// Propiedades pblicas
public Tipo1 Clave
{
get { return clave; }
set { clave = value; }
}
public Tipo2 Grupo
{
get { return grupo; }
set { grupo = value; }
}
}29
Clases parametrizadas con
varios tipos (cont.)
// Declaracin y creacin de los objetos
Persona Empleado = new Persona();
Persona Estudiante = new Persona();
// Uso de los objetos
Empleado.Clave = int.Parse(txtClave.Text);
Empleado.Grupo = int.Parse(txtGrupo.Text);
Estudiante.Clave = txtClave.Text;
Estudiante.Grupo =char.Parse(txtClave.Text);
30
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Clases parametrizadas o
genricas (cont.)
Lecturas complementarias: http://www.desarrolloweb.com/
articulos/generics-c.html
Captulo 13 (Tipos y mtodos
genricos) del libro
Microsoft C#. Curso de
Programacin. 2. ed
31
Colecciones genricas en C#
Incluidas en el namespaceSystem.Collection.Generic
Incorporadas a partir del .NET Framework 2.0
Contiene clases e interfaces que definen tipos genricos para instanciar colecciones
Permite modelar estructuras de datos32
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Estructuras de datos en C#
Coleccin (clase genrica) Estructura de datosArrayList ArreglosStack PilasQueue ColasList Listas enlazadas simplesLinkedList Listas enlazadas dobles
33
Listas enlazadas simples
Estructura de datos compuesta de nodos en secuencia enlazados a travs de una referencia (apuntador).
Cada nodo se compone de 2 partes: Datos Referencia al siguiente nodo
Adems, hay una referencia al primer nodo de la lista y el ltimo nodo apunta a nulo
34
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
La clase genrica List
Modela listas enlazadas en C# Requiere un parmetro adicional para
definir el tipo de dato que almacena El parmetro se coloca entre < y > P. ejem.
List ListaSimpleEnteros; List ListaReales;
35
Principales mtodos y
propiedades de la clase
genrica List
Mtodo o propiedad UsoClear() Elimina todos los nodos de la listaAdd() Agrega un nodo al final de la listaRemove() Elimina la primera ocurrencia de un nodo de la
lista y devuelve un valor booleano para confirmarla operacin
Contains() Determina si un nodo se encuentra almacenado en la lista
Count Devuelve la cantidad de nodos almacenados en la lista
Sort() Ordena en forma ascendente los nodos de la listaGetEnumerator() Recorre los nodos de la lista y devuelve un
enumerador.36
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Ejemplo de lista
Crear una clase para modelar objetos con datos de empleados
Crear una lista que almacene muchos empleados
37
Creacin de un objeto de una
lista genrica
Creacin de un objeto de una lista genrica List miEmpresa = new List();
El objeto miEmpresa es una lista genrica que almacena objetos de la clase Empleado
38
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Captura de datos de un nodo
de la lista genrica
Capturar los datos de un empleado en textBoxes
Al oprimir el botn insertar, crear un objeto de la clase Empleado e insertarlo en la lista genrica
Mostrar los datos en un dataGridView
39
Creacin de un empleado
(nodo de la lista)
Crear un objeto con los datos de un empleado para agregarlo a la lista Empleado miEmpleado = new Empleado();
Llenar los datos del empleado miEmpleado.Numero = int.Parse(textBox1.Text); miEmpleado.Nombre = textBox2.Text; miEmpleado.Sueldo = double.Parse(textBox3.Text);
40
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Insertar un empleado
(agregar un nodo a la lista)
Insertar el empleado en la lista miEmpresa.Add(miEmpleado);
Crear el dataGridViewdataGridView1.Columns.Add("Nmero", "Nmero");dataGridView1.Columns.Add("Nombre", "Nombre");dataGridView1.Columns.Add("Sueldo", "Sueldo");
// Inicializa las propiedades del dataGridView1dataGridView1.ReadOnly = true;dataGridView1.AllowUserToAddRows = false;dataGridView1.AllowUserToDeleteRows = false;dataGridView1.AutoSizeColumnsMode =
DataGridViewAutoSizeColumnsMode.Fill;41
Iteradores
Es un conjunto de instrucciones quedevuelve una secuencia de valores del mismo tipo.
Puede invocarse mediante un cicloforeach
P.ejem.foreach(int Dato in X){
} 42
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
El ciclo foreach
Se utiliza para recorrer los elementos de una coleccin y obtener la informacin deseada.
No se debe utilizar para modificar el contenido de la coleccin.
foreach repite un grupo de instruccionesincluidas en el cuerpo del ciclo para cadaelemento de una estructura de datos.
43
Uso de un iterador para
limpiar los textBoxes
foreach(Control x in groupBox1.Controls)if(x is TextBox)
x.Text=;
44
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Ejemplo de un iterador en una
coleccin genrica de una lista
Para recorrer los nodos de una listaforeach(Empleado Nodo in miEmpresa) Donde: Empleado: Clase que define los datos de
los empleados Nodo: Objeto de tipo Empleado que
contiene los datos de un empleado miEmpresa: Objeto de la coleccin genrica
45
Mostrar los datos de una
lista en un dataGridView
foreach(Empleado miEmpleado in miEmpresa){ dataGridView1.Rows.Add(miEmpleado.Numero, miEmpleado.Nombre, miEmpleado.Sueldo)
}
46
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
El mtodo GetEnumerator()
Sirve para implementar iteradores El mtodo GetEnumerator()
devuelve un enumerador que recorre en iteraciones una coleccin.
Lo contiene System.Collections
Se utiliza por medio del ciclo foreach47
Implementacin de un iterador a
travs del mtodo
GetEnumerator()
El mtodo GetEnumerator()devuelve una secuencia de valores del mismo tipo IEnumerator.
Utiliza la instruccin yield returnpara devolver cada elemento
Utiliza la instruccin yield break para finalizar la iteracin (ciclo) cuando sea necesario.
48
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Ejemplo de
GetEnumerator()
public IEnumerator GetEnumerator(){if(Arreglo.Tamao == 0)
yield break;for(i=0; i
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Grados de dependencia
(cardinalidad o multiplicidad)
51
Representacin Descripcin de la cardinalidad1 Uno y slo uno
1..1 Uno a uno0..1 Cero unoM..N Desde M hasta NM,N M N
* Cero muchos0..* Cero muchos1..* Uno muchos (al menos uno)
Ejemplos
52
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Composicin
Define una relacin fuerte entre clases Se utiliza para modelar un " todo" y sus
" partes " donde El " todo" no puede existir si no existen sus "
partes" Las " partes" desaparecen cuando se elimina el
" todo "
53
54
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Representacin de la
composicin
Grficamente se representa colocando un rombo negro en el extremo de la clase constituida (parte del todo).
55
56
Composicin
Un objeto puede tener como miembro a otro objetodefinido previamente.
Cuando un objeto se encuentra compuesto por otrosobjetos, se dice que hay Composicin.
La composicin permite implementar relaciones del tipo tiene un. Ejemplo: Un Auto tiene un Motor.
Una caracterstica importante de la composicin esque la clase del todo regularmente contiene un destructor para eliminar sus partes
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
57
Reglas para que exista
composicin
Existen tres reglas para que se presente la relacinde composicin entre dos clases:
1. La clase del todo DEBE tener un atributo de tipoparte
a) Un objeto cuando es relacin 1..1b) Una coleccin genrica si es relacin 1..*
2. La clase del todo DEBE tener un mtodo para insertarle objetos de tipo parte
3. La clase del todo DEBE tener el destructora) Al eliminar el objeto del todo, tambin se deben
eliminar sus partes
58
Composicin
ProcesosDeUsuario Impresion
class Impresion{
public void Imprimir(string Titulo, string mensaje){
System.Console.WriteLine(Titulo.ToUpper());System.Console.WriteLine(mensaje);
}}class ProcesosDeUsuario{
private Impresion imp;public void ImprimirInstrucciones(){
imp = new Impresion();imp.Imprimir("Bienvenido", "Presione Enter para continuar");System.Console.ReadLine();
}}
Composicin
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Relacin 1..1 en
Composicin
59
Implementacin de relacin
1..1 en composicin
class Todo{
// Atributo (objeto componente del Todo)private Parte Componente = new Parte();
// Mtodo para insertar un componentepublic void Insertar(Parte P) {
Componente = P;}// Destructor (elimina el componente)~Todo() {
Componente = null;}
} 60
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Representacin de la
relacin 1..1
Un objeto de la clase del todo tiene dentro un objeto de la clase parte
El objetoTodotiene un objetoParte como atributo
61
objetoTodoAtributos del objetoTodo
Mtodos del objetoTodo
objetoParte
Atributos delobjetoParte
Mtodos delobjetoParte
Relacin 1..* en
Composicin
62
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Implementacin de relacin
1..* en composicin
class Todo{
// Atributo (lista de componentes del Todo)private List ListaComponentes = new List();
// Mtodo para insertar una parte a la listapublic void Insertar(Parte P) {
ListaComponentes.Add(P);}// Destructor (elimina el componente)~Todo() {
ListaComponentes.Clear();}
} 63
Representacin de la
relacin 1..*
Un objeto de la clase del todo tiene dentro una coleccin de objetos de la clase parte
El objetoTodotiene una lista de objetoPartecomo atributo
64
objetoTodoAtributos del objetoTodo
Mtodos del objetoTodo
objetoParte
Atributos delobjetoParte
Mtodos delobjetoParte
objetoParte
Atributos delobjetoParte
Mtodos delobjetoParte
objetoParte
Atributos delobjetoParte
Mtodos delobjetoParte
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Cmo recorrer todas las partes
de la ListaComponentes?
Implementar un iterador por medio del mtodoGetEnumerator()
65
Implementacin del iterador
class Todo
{
. . .
. . .
. . .
public IEnumerator GetEnumerator()
{
foreach (Parte p in ListaComponentes)
yield return p;
}
}66
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Otra forma de
implementacin del iteradorclass Todo
{
. . .
. . .
. . .
public IEnumerator GetEnumerator()
{
return ListaComponentes.GetEnumerator();
}
}
67
68
Modelo UML con varias
composiciones
Un objeto de tipo todo puede componerse de objetos de diferentes tipos de partes
El todo tiene un atributo de cada tipo de parte El todo tiene un mtodo para agregar cada tipo de
parte El todo tiene un destructor para eliminar todas sus
partes El todo tiene varios iteradores (uno para cada tipo
de parte).
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Modelo UML con varias
composiciones (cont.)
69
70
Diseo de una clase con
varios iteradores
Cuando una clase requiere varios iteradores, estosno pueden implementarse a travs del mtodoGetEnumerator().
Una clase no puede implementar varios mtodosGetEnumerator().
Se recomienda implementar una propiedad de sololectura para cada iterador.
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Implementacin de iteradores a
travs de propiedades
class Todo
{
. . .
public IEnumerable ListaPartes1
{
get
{
foreach(Parte1 p in listaPartes1)
yield return p;
yield break;
}
}
} 71
7272
Composicin vs. Herencia
Usar Cuando
Herencia
(Es un)
Se desee incorporar en la clase las variables, propiedades y mtodos de otra clase. Se desee especializar una clase (agregando caractersticas especficas).
Composicin
(Tiene un o unos)
Se desee ocultar, o encapsular un objeto bajouna nueva interfaz. Un objeto contenga otro objeto.
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Agregacin
Define una relacin donde una clase se puede formar de otras clases
Sin embargo, la existencia de objetos de dichas clases es independiente
Se utiliza para modelar un " todo" y sus " partes " donde El " todo" se forma agregando sus" partes" Las " partes" pueden pertenecer a varios " todos " Si se elimina el " todo" pueden seguir existiendo
sus" partes" 73
74
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Representacin de la
agregacin
Grficamente se representa colocando un rombo blanco en el extremo de la clase constituida (parte del todo).
75
76
Reglas para que exista
agregacin
Existen dos reglas para que se presente la relacinde agregacin entre dos clases:
1. La clase del todo DEBE tener un atributo de tipoparte
a) Un objeto cuando es relacin 1..1b) Una coleccin genrica si es relacin 1..*
2. La clase del todo DEBE tener un mtodo para insertarle objetos de tipo parte
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
77
Modelo UML con varias
agregaciones
A un objeto de tipo todo pueden agregarse objetosde diferentes tipos de partes
El todo tiene un atributo de cada tipo de parte El todo tiene un mtodo para agregar cada tipo de
parte El todo tiene varios iteradores (uno para cada tipo
de parte). Los iteradores se implementan a travs de
propiedades de solo lectura
78
Reglas para que exista
agregacin (cont.)
En la agregacin, la clase del todo NO es necesarioque tenga el destructor, ya que si se elimina unobjeto del todo sus partes siguen existiendo porquepueden pertenecer a otros todos.
En pocas palabras
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
79
Agregacin vs. Herencia
class A{ public int var1;
public int var2;public int var3;
}class B : A{ public int var4;
public int var5;}class Programa{ static void Main()
{ B objetoB = new B();objetoB.
}}
Mapa de memoria para objetoBobjetoB . var1
var2
var3
var4
var5
a) HERENCIA
80
Agregacin vs. Herencia
class A{ public int var1;
public int var2;public int var3;
}class B{ public A objetoA = new A();
public int var4;public int var5;
}class Programa{ static void Main()
{ B objetoB = new B();objetoB.
}}
Mapa de memoria para objetoBobjetoB . objetoA . var1
var2
var3
var4
var5
b) AGREGACIN
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Composicin vs. Agregacin
81
Criterio de comparacin Composicin Agregacin
Es una relacin entre clases de un todo y sus partesEl todo depende de la existencia de sus partes
Las partes pueden pertenecer a varios todos
Si se elimina el todo tambin se eliminan sus partesLa clase del todo contiene atributo(s) que representa(n) las partesLa clase del todo contiene mtodo(s) para insertar sus partesLa clase del todo tiene un destructor para eliminar sus partes
82
Composicin vs.
agregacin (cont.)
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Cmo contar la cantidad de
partes de un todo ?
83
Contar los departamentos
de una empresa
Un objeto de la clase del todo (miEmpresa) tiene dentro una coleccin de objetos de la clase parte (miDepto)
En este caso, el mtodo devuelve el valor 3. 84
miEmpresa
InsertarDepartamento(Departamento d): voidGetEnumerator( ) : IenumeratorContarDepartamentos( ) : int
miDepto1
Nombre=ISCEmpleados=20
ToString()
miDepto2
Nombre=RHEmpleados=13
ToString()
miDepto3
Nombre=MCEmpleados=21
ToString()
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Diagrama de flujo para contar
los departamentos de una
empresa (opcin 1)
85
Diagrama de flujo para contar
los departamentos de una
empresa (opcin 2)
86
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Cmo sumar un atributo de
las partes de un todo ?
87
Sumar la cantidad de empleados
de los departamentos de la
empresa
El mtodo recorre la lista de departamentos para acumular la cantidad de empleados
En este caso, el mtodo devuelve el valor 54
88
miEmpresa
InsertarDepartamento(Departamento d): voidGetEnumerator( ) : IenumeratorSumarEmpleados( ) : int
miDepto1
Nombre=ISCEmpleados=20
ToString()
miDepto2
Nombre=RHEmpleados=13
ToString()
miDepto3
Nombre=MCEmpleados=21
ToString()
Programacin Orientada a Objetos con C#
Dr. Ramn V. Roque HernndezIng. Bruno Lpez Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Diagrama de flujo para sumar la
cantidad de empleados de los
departamentos de la empresa
89
Referencias adicionales
http://www.dcc.uchile.cl/~psalinas/uml/modelo.html
http://arodm.blogspot.com/2008/09/uml-relaciones-compocicion-agregacion.html
90