03.- Herencia

45
Programación Orientada a Objetos con C# Dr. Ramón V. Roque Hernández Ing. Bruno López Takeyas, M.C. http://www.itnuevolaredo.edu.mx/Takeyas 1 Programación Orientada a Objetos en C# Autor: Dr. Ramón Roque Hernández http://ramonroque.com/Materias/pooTec.htm [email protected] Colaborador: Ing. Bruno López Takeyas, M.C. www.itnuevolaredo.edu.mx/takeyas [email protected] Unidad 3.- Herencia 2 Relaciones entre clases: Herencia, Composición y Agregación

description

c# Herencia

Transcript of 03.- Herencia

  • 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/[email protected]

    Colaborador:Ing. Bruno Lpez Takeyas, M.C.www.itnuevolaredo.edu.mx/[email protected]

    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