Programación Orientada a Objetos con C#
Prog Pr ogra rama maci ción ón Or Orie ient ntad ada a a Obj Objet etos os en C# Unidad 3.- Herencia Autor: Dr. Ramón Roque Hernánd Dr. Hernández ez http://ramonroque.com/Materias/pooTec.htm
[email protected]
Colaborador: Ing. Bruno López Takeyas, M.C. www.itnuevolaredo.edu.mx/takeyas
[email protected]
1
Relac Rel acion iones es en entr tre e clases: clases: Herencia, Composición y Agregación
2
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
3
Herencia • Caract Caracterí erísti stica ca de la la POO POO que que pe permit rmite e defi de fini nirr nu nuev evas as cl clas ases es a par parti tirr de ot otra ras s ya exi existe stente ntes. s.
• Las clases clases ex exist istent entes es “tr “trans ansmit miten en”” sus características.
4
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
3
Herencia • Caract Caracterí erísti stica ca de la la POO POO que que pe permit rmite e defi de fini nirr nu nuev evas as cl clas ases es a par parti tirr de ot otra ras s ya exi existe stente ntes. s.
• Las clases clases ex exist istent entes es “tr “trans ansmit miten en”” sus características.
4
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Here He renc ncia ia (c (con ont. t.)) • Pu Pued ede e us usar arse se pa para ra:: – Relacion Relaciones es del tipo “es un” • Ejem Ejempl plo: o: Un Ge Gere rent nte e “e “es s un un”” Emp Emple lead ado o co con n caracterís carac terísticas ticas propia propias s adici adicionales onales..
• Obje Objetivo: tivo: Reutiliza Reutilización ción de código. código.
5
Herencia (Propiedades: Interruptor, CableElectrico Interruptor,
Aparato_Electrodomestico
Métodos: Encender, Apagar)
Herendan características de Aparato_Electrodomestico e incorporan las suyas propias.
Lavadora • Propiedades: (Interruptor,, CableElectrico, (Interruptor PerillaDeCiclosDeLavado, PerillaDeCiclosDeLava do, CapacidadDeCarg CapacidadDeCarga a) • Métodos: (Encender, Apagar, LlenarConAgua, TirarAgua TirarAgua))
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
Televisión • Propiedades: (Interruptor, CableElectrico, (Interruptor, BotonDeCanales, BotonDeV BotonDeVolumen olumen)) • Métodos: (Encender, Apagar, CambiarVolumen, CambiarCanal )
6
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
so de la Herencia • Beneficios: – Permte escribir menos código. – Mejora la reusabilidad de los componentes. – Facilita el mantenimiento del sistema completo.
• Util para un buen diseño del programa. • Un diseño pobre sin herencia implementaría las clases involucradas de manera independiente.
7
Herencia en C# • En C# solo se permite Herencia simple. • Ejemplo de Herencia en C# class A { } class B : A { }
Indica que B “Hereda de” A
• Todos los objetos heredan de System.Object 8
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
!jemplo de "erencia class Persona { …. }
class Empleado:Persona { …. }
class Administrador:Empleado { …. }
class Estudiante:Persona { …. }
class Profesor:Empleado { …. }
9
!jercicio • Se deben modelar dos clases con las siguientes características: Automovil
PalaMecanica
CaballosDeFuerza: int CantidadDePuertas: int
CaballosDeFuerza: int PesoMaximoDeLevante: int
Arrancar() : void Detener() : void Acelerar(int cuanto): void
Arrancar() : void Detener() : void MoverPala(string direccion) : void
10
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
al $ise%o (&o recomendable) •
Modelarlas de manera independiente.
class Automovil { private int cf, cp; public int CaballosDeFuerza { Iguales get { return cf; } set { cf = value; } } public int CantidadDePuertas { get { return cp; } set { cp = value; } } public void Arrancar() { Iguales } public void Detener() { Iguales } 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) { } }
11
$ise%o 'sando Herencia (Recomendado) Vehiculo CaballosDeFuerza : int Arrancar() : void Detener() : void Herencia
Automovil
Superclase (Clase base) (Clase padre) (Clase madre)
Subclases (Clases derivadas) (Clases Hijas) PalaMecanica
CantidadDePuertas : int
PesoMaximoDeLevante : int
Acelerar(int cuanto) : void
MoverPala(string direccion) : void
12
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
$ise%o de las clases 'sando "erencia 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) { } } 13
&otas sobre el ejemplo •
Todas las variables, métodos y propiedades que no sean privadas, serán 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(); } }
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
14
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
lamando m*todos de la clase base •
Una subclase puede llamar los métodos 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(); } 15 }
+ec'encia de ejec'ción de constr'ctores en la Herencia Considerar el siguiente ejemplo… ¿Qué salida se obtiene? 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(); } } 16
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
+ec'encia de ejec'ción de constr'ctores en la Herencia Salida del programa… System.Object
Constructor de la clase A Constructor de la clase B Constructor de la clase C
A 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”, después el constructor de la clase “B”, y finalmente el constructor de la clase “C”
B
C
17
+ec'encia de ejec'ción de los destr'ctores 'sando "erencia 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(); } }
18
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
+ec'encia de ejec'ción de los destr'ctores 'sando "erencia La salida del programa es… Constructor de la clase A Constructor de la clase B Constructor de la clase C Destructor de la clase C Destructor de la clase B Destructor de la clase A
Los destructores son invocados en orden inverso a los constructores.
19
n-ocando constr'ctores de la clase base class 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(); } }
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
La salida del programa es… X=1 Y=2 R =1
La palabra reservada base( ) hace referencia a la clase padre inmediata desde la cual se invoca. Entre paréntesis se especifican los parámetros requeridos.
20
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
!-itando la "erencia: Clases sealed •
•
•
Las clases sealed (selladas) pueden ser instanciadas pero NO heredadas. Se utiliza la palabra “sealed” para indicarlo. Usar “sealed” simultáneamente con “abstract” produce un error.
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; } } 21 }
Clases parametriadas o gen*ricas • Ejemplo: Una empresa y una escuela desean almacenar la clave y nombre de sus personas: – Clave: Entero ó String – Nombre: String
• Pero en la empresa la clave es numérica entera y en la escuela es una cadena. 22
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Clases parametriadas o gen*ricas (cont.) Clases iguales (excepto en el tipo de dato de la clave) Escuela
Empresa
23
Clases parametriadas o gen*ricas (cont.) • Diseñar una clase parametrizada que sirva para ambos casos:
24
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Codi/icación de la clase parametriada class Persona
{
// Clase parametrizada o genérica
// 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 #ombre { get { return nombre; ! set { nombre " value; ! !
25
!
Clases parametriadas o gen*ricas (cont.) // $eclaraci%n & creaci%n de los ob'etos
Persona (mpleado " ne) Persona*+; Persona (studiante " ne) Persona*+;
// ,so de los ob'etos
(mpleado-Clave " int-Parse*t.tClave-Te.t+; (studiante-Clave " t.tClave-Te.t; 26
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Clases parametriadas con -arios tipos • Ejemplo: Una empresa y una escuela desean almacenar la clave y grupo de sus personas: – Clave: Entero ó String – Nombre: Entero ó caracter
27
Clases parametriadas con -arios tipos Clases iguales (excepto en los tipos de datos) Escuela
Empresa
28
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Codi/icación de la clase parametriada con -arios tipos class Persona // Clase parametrizada con varios tipos { // Atributos privados private Tipo clave; private Tipo1 grupo; // Propiedades pblicas public Tipo Clave { get { return clave; ! set { clave " value; ! ! public Tipo1 2rupo { get { return grupo; ! set { grupo " value; ! !
29
!
Clases parametriadas con -arios tipos (cont.) // $eclaraci%n & creaci%n de los ob'etos Persona (mpleado " ne) Persona*+; Persona (studiante " ne) Persona*+;
// ,so de los ob'etos
(mpleado-Clave " int-Parse*t.tClave-Te.t+; (mpleado-2rupo " int-Parse*t.t2rupo-Te.t+; (studiante-Clave " t.tClave-Te.t; (studiante-2rupo "c3ar-Parse*t.tClave-Te.t+; 30
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Clases parametriadas o gen*ricas (cont.) Lecturas complementarias: 4 3ttp5//)))-desarrollo)eb-com/ articulos/generics6c-3tml 4 Cap7tulo 8 *Tipos & métodos genéricos+ del libro 9:icrosoft C- Curso de Programaci%n- 1- ed=
31
Colecciones gen*ricas en C# • Incluidas en el namespace System.Collection.Generic
• Incorporadas a partir del .NET Framework 2.0 • Contiene clases e interfaces que definen tipos genéricos para instanciar colecciones • Permite modelar estructuras de datos 32
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
!str'ct'ras de datos en C#
Colección (clase genérica) Estructura de datos ArrayList
Arreglos
Stack
Pilas
Queue
Colas
List
Listas enlazadas simples
LinkedList
Listas enlazadas dobles
33
istas enlaadas simples • Estructura de datos compuesta de nodos en secuencia enlazados a través de una referencia (apuntador). • Cada nodo se compone de 2 partes: – Datos – Referencia al siguiente nodo
• Además, hay una referencia al primer nodo de la lista y el último nodo apunta a nulo
34
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
a clase gen*rica ist • Modela listas enlazadas en C# • Requiere un parámetro adicional para definir el tipo de dato que almacena • El parámetro se coloca entre < y > • P. ejem. – List ListaSimpleEnteros; – List ListaReales;
35
Principales m*todos y propiedades de la clase gen*rica ist Método o propiedad
Uso
Clear()
Elimina todos los nodos de la lista
Add()
Agrega un nodo al final de la lista
Remove()
Elimina la primera ocurrencia de un nodo de la lista y devuelve un valor booleano para confirmar la operación
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 lista
GetEnumerator()
Recorre los nodos de la lista y devuelve un enumerador. 36
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
!jemplo de lista • Crear una clase para modelar objetos con datos de empleados • Crear una lista que almacene muchos empleados 37
Creación de 'n objeto de 'na lista gen*rica • Creación de un objeto de una lista genérica – List miEmpresa = new List();
• El objeto miEmpresa es una lista genérica que almacena objetos de la clase Empleado 38
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Capt'ra de datos de 'n nodo de la lista gen*rica • Capturar los datos de un empleado en textBoxes • Al oprimir el botón insertar, crear un objeto de la clase Empleado e insertarlo en la lista genérica • Mostrar los datos en un dataGridView 39
Creación de 'n 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
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
nsertar 'n empleado (agregar 'n nodo a la lista) • Insertar el empleado en la lista miEmpleado); – miEmpresa.Add(
• Crear el dataGridView dataGridView1.Columns.Add("Número",
"Número");
dataGridView1.Columns.Add("Nombre",
"Nombre");
dataGridView1.Columns.Add("Sueldo",
"Sueldo");
// Inicializa las propiedades del dataGridView1 dataGridView1.ReadOnly = true; dataGridView1.AllowUserToAddRows = false; dataGridView1.AllowUserToDeleteRows = false; dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill ; 41
teradores • Es un conjunto de instrucciones que devuelve una secuencia de valores del mismo tipo. • Puede invocarse mediante un ciclo foreach
• P.ejem. foreach(int Dato in X) { …… }
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
42
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
!l ciclo /oreac" • Se utiliza para recorrer los elementos de una colección y obtener la información deseada. • No se debe utilizar para modificar el contenido de la colección. • foreach repite un grupo de instrucciones incluidas en el cuerpo del ciclo para cada elemento de una estructura de datos. 43
so de 'n iterador para limpiar los te0t1o0es foreach(Control x in groupBox1.Controls) if(x is TextBox) x.Text=“”;
44
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
!jemplo de 'n iterador en 'na colección gen*rica de 'na lista • Para recorrer los nodos de una lista foreach(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 colección genérica 45
ostrar los datos de 'na lista en 'n data2rid3ie4 foreach(Empleado miEmpleado in miEmpresa) { dataGridView1.Rows.Add(miEmpleado.Numero, miEmpleado.Nombre, miEmpleado.Sueldo) }
46
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
!l m*todo 2et!n'merator() • Sirve para implementar iteradores • El método GetEnumerator() devuelve un enumerador que recorre en iteraciones una colección. • Lo contiene System.Collections • Se utiliza por medio del ciclo foreach 47
mplementación de 'n iterador a tra-*s del m*todo 2et!n'merator() • El método GetEnumerator() devuelve una secuencia de valores del mismo tipo IEnumerator. • Utiliza la instrucción yield return para devolver cada elemento • Utiliza la instrucción yield break para finalizar la iteración (ciclo) cuando sea necesario. 48
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
!jemplo de 2et!n'merator() public IEnumerator GetEnumerator() { if(Arreglo.Tamaño == 0) yield break; for(i=0; i
Relaciones entre clases
Composición
Relaciones Agregación
50
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
2rados de dependencia (cardinalidad o m'ltiplicidad) Representación 1
Descripción de la cardinalidad Uno y sólo uno
1..1
Uno a uno
0..1
Cero ó uno
M..N
Desde M hasta N
M,N
MóN
*
Cero ó muchos
0..*
Cero ó muchos
1..*
Uno ó muchos (al menos uno) 51
!jemplos
52
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Composición • Define una relación fuerte entre clases • Se utiliza para modelar un " todo" y sus " partes " donde … " todo " no puede existir si no existen sus partes "
– El
"
partes " desaparecen cuando se elimina el " todo "
– Las "
53
54
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Representación de la composición • Gráficamente se representa colocando un rombo negro en el extremo de la clase constituida (parte del “todo”).
55
Composición • Un objeto puede tener como miembro a otro objeto definido previamente. • Cuando un objeto se encuentra compuesto por otros objetos, se dice que hay “Composición”. • La composición permite implementar relaciones del tipo “tiene un”. – Ejemplo: Un Auto “tiene un” Motor.
• Una característica importante de la composición es que la clase del “todo” regularmente contiene un destructor para eliminar sus “partes”
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
56
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Reglas para 5'e e0ista composición • Existen tres reglas para que se presente la relación de composición entre dos clases: 1. La clase del “todo” DEBE tener un atributo de tipo “parte” a) Un objeto cuando es relación 1..1 b) Una colección genérica si es relación 1..*
2. La clase del “todo” DEBE tener un método para insertarle objetos de tipo “parte” 3. La clase del “todo” DEBE tener el destructor a) Al eliminar el objeto del “todo”, también se deben eliminar sus “partes” 57
Composición ProcesosDeUsuario
Impresion
class Impresion { public void Imprimir(string Titulo, string mensaje) { System.Console.WriteLine(Titulo.ToUpper()); System.Console.WriteLine(mensaje); } } class ProcesosDeUsuario Composición { private Impresion imp; public void ImprimirInstrucciones() { imp = new Impresion(); imp.Imprimir("Bienvenido", "Presione Enter para continuar"); System.Console.ReadLine(); } } 58
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Relación 6..6 en Composición
59
mplementación de relación 6..6 en composición class Todo { // Atributo (objeto componente del Todo) private Parte Componente = new Parte(); // Método para insertar un componente public void Insertar(Parte P) { Componente = P; } // Destructor (elimina el componente) ~Todo() { Componente = null; }
}
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
60
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Representación de la relación 6..6 objetoTodo Atributos del objetoTodo objetoParte Atributos del objetoParte Métodos del objetoParte
Métodos del objetoTodo
• Un objeto de la clase del “todo” tiene dentro un objeto de la clase “parte” • El objetoTodo tiene un objetoParte como atributo 61
Relación 6..7 en Composición
62
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
mplementación de relación 6..7 en composición class Todo { // Atributo (lista de componentes del Todo) private List ListaComponentes = new List();
// Método para insertar una parte a la lista public void Insertar(Parte P) { ListaComponentes.Add(P); } // Destructor (elimina el componente) ~Todo() { ListaComponentes.Clear(); } 63
}
Representación de la relación 6..7 objetoTodo Atributos del objetoTodo objetoParte
objetoParte
objetoParte
Atributos del objetoParte
Atributos del objetoParte
Atributos del objetoParte
Métodos del objetoParte
Métodos del objetoParte
Métodos del objetoParte
Métodos del objetoTodo
• Un objeto de la clase del “todo” tiene dentro una colección de objetos de la clase “parte” • El objetoTodo tiene una lista de objetoParte como atributo 64
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
8Cómo recorrer todas las partes de la istaComponentes9 • Implementar un iterador por medio del método 2et(numerator*+
65
mplementación del iterador class Todo { - - - - - - public (numerator 2et(numerator*+ { foreac3 *Parte p in ?istaComponentes+ &ield return p; ! ! 66
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Otra /orma de implementación del iterador class Todo { - - - - - - public (numerator 2et(numerator*+ { return ?istaComponentes-2et(numerator*+; ! ! 67
odelo con -arias 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 método 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”). 68
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
odelo con -arias composiciones (cont. )
69
$ise%o de 'na clase con -arios iteradores • Cuando una clase requiere varios iteradores, estos no pueden implementarse a través del método GetEnumerator(). • Una clase no puede implementar varios métodos GetEnumerator(). • Se recomienda implementar una propiedad de solo lectura para cada iterador.
70
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
mplementación de iteradores a tra-*s de propiedades class Todo { - - public IEnumerable ?istaPartes { get { foreac3*Parte p in listaPartes+ &ield return p; &ield brea@; ! ! 71
!
Composición -s. Herencia Usar… Herencia
(Es un…)
Composición
Cuando… • Se desee incorporar en la clase las variables, propiedades y métodos de otra clase. • Se desee especializar una clase (agregando características específicas). • Se desee ocultar, o encapsular un objeto bajo una nueva interfaz. • Un objeto contenga otro objeto.
(Tiene un o unos…)
72
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Agregación • Define una relación 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 "
partes " pueden pertenecer a varios " todos " – Si se elimina el " todo " pueden seguir existiendo 73 sus" partes " – Las "
74
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Representación de la agregación • Gráficamente se representa colocando un rombo blanco en el extremo de la clase constituida (parte del “todo”).
75
Reglas para 5'e e0ista agregación • Existen dos reglas para que se presente la relación de agregación entre dos clases: 1. La clase del “todo” DEBE tener un atributo de tipo “parte” a) Un objeto cuando es relación 1..1 b) Una colección genérica si es relación 1..*
2. La clase del “todo” DEBE tener un método para insertarle objetos de tipo “parte” 76
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
odelo con -arias agregaciones • A un objeto de tipo “todo” pueden agregarse objetos de diferentes tipos de “partes” • El “todo” tiene un atributo de cada tipo de “parte” • El “todo” tiene un método para agregar cada tipo de “parte” • El “todo” tiene varios iteradores (uno para cada tipo de “parte”). • Los iteradores se implementan a través de propiedades de solo lectura 77
Reglas para 5'e e0ista agregación (cont. ) • En la agregación, la clase del “todo” NO es necesario que tenga el destructor, ya que si se elimina un objeto del “todo” sus partes siguen existiendo porque pueden pertenecer a otros “todos”. • En pocas palabras…
78
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Agregación -s. Herencia a) 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 objetoB objetoB .
var1
var2 var3 var4
var5
79
Agregación -s. Herencia b) AGREGACIÓN 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 objetoB objet oB .
objetoA .
var1
var2 var3 var4
var5
80
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
Composición -s. Agregación Criterio de comparación
Composición
Agregación
Es una relación entre clases de un «todo» y sus «partes»
El «todo» depende de la existencia de sus «partes»
Las «partes» pueden pertenecer a varios «todos»
Si se elimina el «todo» también se eliminan sus «partes»
La clase del «todo» contiene atributo(s) que representa(n) las «partes»
La clase del «todo» contiene método(s) para insertar sus «partes»
La clase del «todo» tiene un destructor para eliminar sus «partes»
81
Composición -s. agregación (cont. )
82
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
8 Cómo contar la cantidad de partes; de 'n todo; 9
83
Contar los departamentos de 'na empresa miEmpresa
miDepto1
miDepto2
miDepto3
Nombre=“ISC” Empleados=20
Nombre=“RH” Empleados=13
Nombre=“MC” Empleados=21
ToString()
ToString()
ToString()
InsertarDepartamento(Departamento d): void GetEnumerator( ) : Ienumerator ContarDepartamentos( ) : int
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
• Un objeto de la clase del “todo” (miEmpresa) tiene dentro una colección de objetos de la clase “parte” (miDepto) • En este caso, el método devuelve el 84 valor 3.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
$iagrama de /l'jo para contar los departamentos de 'na empresa (opción 6)
85
$iagrama de /l'jo para contar los departamentos de 'na empresa (opción <)
86
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
Programación Orientada a Objetos con C#
8 Cómo s'mar 'n atrib'to de las partes; de 'n todo; 9
87
+'mar la cantidad de empleados de los departamentos de la empresa miEmpresa
miDepto1
miDepto2
miDepto3
Nombre=“ISC” Empleados=20
Nombre=“RH” Empleados=13
Nombre=“MC” Empleados=21
ToString()
ToString()
ToString()
InsertarDepartamento(Departamento d): void GetEnumerator( ) : Ienumerator SumarEmpleados( ) : int
Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C.
•El método recorre la lista de departamentos para acumular la cantidad de empleados •En este caso, el método devuelve el valor 54 88
http://www.itnuevolaredo.edu.mx/Takeyas