You are on page 1of 30

Programación Orientada a Objetos con C#

Programación Orientada a Objetos en C#
Unidad 3.- Herencia
Autor: Dr. Ramón Roque Hernández http://ramonroque.com/Materias/pooTec.htm ramonroque@yahoo.com Colaborador: Ing. Bruno López Takeyas, M.C. www.itnuevolaredo.edu.mx/takeyas takeyas@itnuevolaredo.edu.mx

1

Relaciones entre clases: Herencia, Composición y Agregación

2

Programación Orientada a Objetos con C#

3

Herencia
• Característica de la POO que permite definir nuevas clases a partir de otras ya existentes.

• Las clases existentes “transmiten” sus características.

4

Programación Orientada a Objetos con C#

Herencia (cont.)
• Puede usarse para:
– Relaciones del tipo “es un”
• Ejemplo: Un Gerente “es un” Empleado con características propias adicionales.

• Objetivo: Reutilización de código.

5

Herencia
Aparato_Electrodomestico
(Propiedades: Interruptor, CableElectrico Métodos: Encender, Apagar)

Herendan características de Aparato_Electrodomestico e incorporan las suyas propias.

Lavadora
• Propiedades: (Interruptor, CableElectrico, PerillaDeCiclosDeLavado, CapacidadDeCarga) • Métodos: (Encender, Apagar, LlenarConAgua, TirarAgua)

Televisión
• Propiedades: (Interruptor, CableElectrico, BotonDeCanales, BotonDeVolumen) • Métodos: (Encender, Apagar, CambiarVolumen, CambiarCanal)

6

• Ejemplo de Herencia en C# class A { } class B : A { } Indica que B “Hereda de” A • Todos los objetos heredan de System. • Un diseño pobre sin herencia implementaría las clases involucradas de manera independiente. – Facilita el mantenimiento del sistema completo. 7 Herencia en C# • En C# solo se permite Herencia simple. – Mejora la reusabilidad de los componentes.Programación Orientada a Objetos con C# Uso de la Herencia • Beneficios: – Permte escribir menos código.Object 8 . • Util para un buen diseño del programa.

} 9 Ejercicio • Se deben modelar dos clases con las siguientes características: Automovil CaballosDeFuerza: int CantidadDePuertas: int Arrancar() : void Detener() : void Acelerar(int cuanto): void PalaMecanica CaballosDeFuerza: int PesoMaximoDeLevante: int Arrancar() : void Detener() : void MoverPala(string direccion) : void 10 .Programación Orientada a Objetos con C# Ejemplo de herencia class Persona { …. } class Empleado:Persona { …. } class Profesor:Empleado { …. } class Administrador:Empleado { …. } class Estudiante:Persona { ….

} } public int PesoMaximoDeLevante { get { return pml. } } public void Arrancar() { Iguales } public void Detener() { Iguales } public void Acelerar(int cuanto) { } } 11 Diseño usando Herencia (Recomendado) Vehiculo CaballosDeFuerza : int Arrancar() : void Detener() : void Herencia Superclase (Clase base) (Clase padre) (Clase madre) Subclases (Clases derivadas) (Clases Hijas) PalaMecanica PesoMaximoDeLevante : int MoverPala(string direccion) : void Automovil CantidadDePuertas : int Acelerar(int cuanto) : void 12 . public int CaballosDeFuerza { get { return cf. } set { cf = value. } set { pml = value. pml. } } public int CantidadDePuertas { get { return cp. class PalaMecanica { private int cf.Programación Orientada a Objetos con C# Mal Diseño (No recomendable) • Modelarlas de manera independiente. } set { cf = value. } } public void Arrancar() { } public void Detener() { } public void MoverPala(string direccion) { } } class Automovil { private int cf. } set { cp = value. public int CaballosDeFuerza { Iguales get { return cf. cp.

} } public void Arrancar() { } public void Detener() { } } class Automovil : Vehiculo { private int cp.Detener(). } } public void MoverPala(string direccion) { } } 13 Notas sobre el ejemplo… • • Todas las variables. public int CaballosDeFuerza { get { return cf. Los elementos heredados se accesan igual que si estuvieran presentes en esa clase. unAuto.MoverPala ("arriba"). unaPala. PalaMecanica unaPala = new PalaMecanica(). unaPala.Detener(). serán heredadas. unaPala. unAuto.Programación Orientada a Objetos con C# Diseño de las clases usando herencia en C# class Vehiculo { private int cf. class Programa { static void Main() { Automovil unAuto = new Automovil(). } } 14 .Arrancar().Acelerar(10). System.Console. public int CantidadDePuertas { get { return cp. } set { pml = value. } set { cf = value. unAuto. } } public void Acelerar(int cuanto) { } } class PalaMecanica : Vehiculo { private int pml. public int PesoMaximoDeLevante { get { return pml. } set { cp = value.ReadLine(). métodos y propiedades que no sean privadas.Arrancar().

} } class programa { static void Main() { C miObjetoC = new C(). ").WriteLine("Acelerando "+ cuanto + " km/hr"). } } class C : B { public C() { System.WriteLine("..").Console.Programación Orientada a Objetos con C# Llamando métodos de la clase base • Una subclase puede llamar los métodos de su superclase con la palabra reservada “base”..Arrancar().WriteLine(" Constructor de la clase C ").Console.Arrancando. } } class Automovil : Vehiculo { public void Acelerar(int cuanto) { System..ReadLine().Console.. class Vehiculo { public void Arrancar() { System.Console. } 15 } Secuencia de ejecución de constructores en la Herencia Considerar el siguiente ejemplo… ¿Qué salida se obtiene? class A { public A() { System.WriteLine("Primero. System. System.Console.WriteLine("Despues.. base..Console. } } class Programa { static void Main() { Automovil miCarro = new Automovil().... } } class B : A { public B() { System.WriteLine(" Constructor de la clase B"). hay que arrancar"). System. } } 16 .Console.Clase Vehiculo. hay que acelerar.. miCarro.Console.Acelerar(10).WriteLine(" Constructor de la clase A").

Console. miObjetoC = null. } ~B() { System. GC. } ~A() { System. y finalmente el constructor de la clase “C” B C 17 Secuencia de ejecución de los destructores usando herencia class A { public A() { System.WriteLine("Constructor de la clase A"). Primero se ejecuta el constructor de la clase padre (Que en realidad siempre es Object). } } class C : B { public C() { System.Programación Orientada a Objetos con C# Secuencia de ejecución de constructores en la Herencia Salida del programa… Constructor de la clase A Constructor de la clase B Constructor de la clase C System.Console.WriteLine("Constructor de la clase C ").Object A Al crear una instancia de C.Console. } ~C() { System.Collect(). } } 18 .Console.Console. después el constructor de la clase “B”.ReadKey().Console.WriteLine("Constructor de la clase B"). luego el constructor de la clase “A”. Console.WriteLine("Destructor de la clase A"). } } class B : A { public B() { System. } } class programa { static void Main() { C miObjetoC = new C().WriteLine("Destructor de la clase C").WriteLine("Destructor de la clase B").

System. 20 .Console. int coordY. coordY) { r = radio.x. } public string ConsultarDatos() { return string. } } class Circulo : Punto { public double r. System.Format("X={0} Y={1} R ={2} ".y.r).ConsultarDatos()).ReadLine(). Entre paréntesis se especifican los parámetros requeridos. } } class Programa { public static void Main() { Circulo c = new Circulo(1. int puntoY) { x = puntoX.Programación Orientada a Objetos con C# Secuencia de ejecución de los destructores usando herencia 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. y. } } 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.WriteLine(c. y = puntoY.Console. 2. 1). public Circulo(int coordX. double radio) :base (coordX. 19 Invocando constructores de la clase base class Punto { public int x. public Punto(int puntoX.

0 • Contiene clases e interfaces que definen tipos genéricos para instanciar colecciones • Permite modelar estructuras de datos 21 Estructuras 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 22 .Programación Orientada a Objetos con C# Colecciones genéricas en C# • Incluidas en el namespace System.NET Framework 2.Generic • Incorporadas a partir del .Collection.

24 .Programación Orientada a Objetos con C# Listas enlazadas simples • Estructura de datos compuesta de nodos en secuencia enlazados a través de una referencia (apuntador). – List <double> ListaReales. – List <int> ListaSimpleEnteros. ejem. • 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 23 La clase genérica List • 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.

Programación Orientada a Objetos con C# Principales métodos y propiedades de la clase genérica List Método o propiedad Clear Add Remove Uso Elimina todos los nodos de la lista Agrega un nodo al final de la lista Elimina la primera ocurrencia de un nodo de la lista y devuelve un valor booleano para confirmar la operación Determina si un nodo se encuentra almacenado en la lista Devuelve la cantidad de nodos almacenados en la lista Ordena en forma ascendente los nodos de la lista Contains Count Sort 25 Ejemplo de lista • Crear una clase para modelar objetos con datos de empleados • Crear una lista que almacene muchos empleados 26 .

Programación Orientada a Objetos con C# Creación de un objeto de una lista genérica • Creación de un objeto de una lista genérica – List<Empleado> miEmpresa = new List<Empleado>(). crear un objeto de la clase Empleado e insertarlo en la lista genérica • Mostrar los datos en un dataGridView 28 . • El objeto miEmpresa es una lista genérica que almacena objetos de la clase Empleado 27 Captura de datos de un nodo de la lista genérica • Capturar los datos de un empleado en textBoxes • Al oprimir el botón insertar.

AllowUserToAddRows = false. dataGridView1.Programación Orientada a Objetos con C# Creación 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(). dataGridView1.Parse(textBox3. "Sueldo"). • Crear el dataGridView dataGridView1. 29 Insertar un empleado (agregar un nodo a la lista) • Insertar el empleado en la lista – miEmpresa. – miEmpleado.Add("Nombre". dataGridView1. "Número"). – miEmpleado.Columns.AllowUserToDeleteRows = false.Add(miEmpleado). • Llenar los datos del empleado – miEmpleado. dataGridView1.Add("Número".Sueldo = double.Parse(textBox1. "Nombre").Add("Sueldo".Text.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ReadOnly = true.Text).Text).Columns.Nombre = textBox2.Numero = int.Columns. // Inicializa las propiedades del dataGridView1 dataGridView1. 30 .Fill. dataGridView1.

• Puede invocarse mediante un ciclo foreach • P. 32 .Programación Orientada a Objetos con C# Iteradores • Es un conjunto de instrucciones que devuelve una secuencia de valores del mismo tipo.ejem. foreach(int Dato in X) { …… } 31 El ciclo foreach • 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.

Programación Orientada a Objetos con C# Uso de un iterador para limpiar los textBoxes foreach(Control x in groupBox1.Text=“”. 33 Ejemplo de un iterador en una colección genérica de una 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 34 .Controls) if(x is TextBox) x.

miEmpleado.Programación Orientada a Objetos con C# Mostrar los datos de una lista en un dataGridView foreach(Empleado miEmpleado in miEmpresa) { dataGridView1.Sueldo) } 35 El método GetEnumerator() • Sirve para implementar iteradores • El método GetEnumerator() devuelve un enumerador que recorre en iteraciones una colección. miEmpleado.Collections • Se utiliza por medio del ciclo foreach 36 .Rows.Numero.Nombre. • Lo contiene System.Add(miEmpleado.

Tamaño.Tamaño == 0) yield break. • 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. for(i=0. i<Arreglo. } 38 .Programación Orientada a Objetos con C# Implementación de un iterador a través del método GetEnumerator() • El método GetEnumerator() devuelve una secuencia de valores del mismo tipo IEnumerator<T>. i++) yield return Arreglo[i]. 37 Ejemplo de GetEnumerator() public IEnumerator GetEnumerator() { if(Arreglo.

1 M.Programación Orientada a Objetos con C# Asociación entre clases Composición Asociación Agregación 39 Grados de dependencia (cardinalidad o multiplicidad) Representación 1 1.* 1..1 0.....* Descripción de la cardinalidad Uno y sólo uno Uno a uno Cero ó uno Desde M hasta N MóN Cero ó muchos Cero ó muchos Uno ó muchos (al menos uno) 40 .N M.N * 0.

Programación Orientada a Objetos con C# Ejemplos 41 Composición • Define una relación 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 " 42 .

Programación Orientada a Objetos con C# 43 Representación de la composición • Gráficamente se representa colocando un rombo negro en el extremo de la clase constituida (parte del “todo”). 44 .

• Una característica importante de la composición es que la clase del “todo” regularmente contiene un destructor para eliminar sus “partes” 45 Composición ProcesosDeUsuario Impresion class Impresion { public void Imprimir(string Titulo. } } 46 . • Cuando un objeto se encuentra compuesto por otros objetos. string mensaje) { System. "Presione Enter para continuar").Console.ToUpper()). imp.Imprimir("Bienvenido".Console. se dice que hay “Composición”.Console. System.ReadLine().WriteLine(mensaje). } } class ProcesosDeUsuario Composición { private Impresion imp. • La composición permite implementar relaciones del tipo “tiene un”. – Ejemplo: Un Auto “tiene un” Motor. public void ImprimirInstrucciones() { imp = new Impresion(). System.WriteLine(Titulo.Programación Orientada a Objetos con C# Composición • Un objeto puede tener como miembro otro objeto definido previamente.

1 en composición class Todo { // Atributo (objeto componente del Todo) private Parte Componente = new Parte(). } // Destructor (elimina el componente) ~Todo() { Componente = null..Programación Orientada a Objetos con C# Relación 1. } } 48 ..1 en Composición 47 Implementación de relación 1. // Método para insertar un componente public void Insertar(Parte P) { Componente = P.

* en Composición 50 .Programación Orientada a Objetos con C# Representación de la relación 1.1 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 49 Relación 1...

} // Destructor (elimina el componente) ~Todo() { ListaComponentes. } } 51 Representación de la relación 1..* objetoTodo Atributos del objetoTodo objetoParte Atributos del objetoParte objetoParte Atributos del objetoParte 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 52 . // Método para insertar una parte a la lista public void Insertar(Parte P) { ListaComponentes.Programación Orientada a Objetos con C# Implementación de relación 1.Clear().Add(P).* en composición class Todo { // Atributo (lista de componentes del Todo) private List<Parte> ListaComponentes = new List<Parte>()..

Programación Orientada a Objetos con C# Composición vs. • Se desee especializar una clase (agregando características específicas). • Un objeto contenga otro objeto. 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 54 sus" partes" . • Se desee ocultar. (Es un…) Composición (Tiene un o unos…) 53 Agregación • Define una relación donde una clase se puede formar de otras clases • Sin embargo. Herencia Usar… Herencia Cuando… • Se desee incorporar en la clase las variables. propiedades y métodos de otra clase. o encapsular un objeto bajo una nueva interfaz.

} class B : A { public int var4. 55 Agregación vs. var1 var2 var3 var4 var5 56 . public int var5. objetoB.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”). } class Programa { static void Main() { B objetoB = new B(). } } Mapa de memoria para objetoB objetoB . public int var2. public int var3. Herencia a) HERENCIA class A { public int var1.

Herencia b) AGREGACIÓN class A { public int var1. } class Programa { static void Main() { B objetoB = new B(). public int var5. } class B { public A objetoA = new A().Programación Orientada a Objetos con C# Agregación vs. Agregación Criterio de comparació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» 58 Composición Agregación . objetoB. public int var3. public int var2. var1 var2 var3 var4 var5 57 Composición vs. public int var4. objetoA . } } Mapa de memoria para objetoB objetoB .

uchile. Se utiliza la palabra “sealed” para indicarlo. } set { _nombre = value. class Persona { private string _nombre. } set { _horasAsignadas = value.Programación Orientada a Objetos con C# Evitando la herencia: Clases sealed • Las clases sealed (selladas) pueden ser instanciadas pero NO heredadas.html • http://arodm.html 60 . public string Nombre { get { return _nombre.com/2008/09/umlrelaciones-compocicion-agregacion. } } 59 } • • ERROR! Referencias adicionales • http://www. } } } class EmpleadoTiempoParcial:Empleado { private int _horasAsignadas. public string Departamento { get { return _departamento.dcc. } } } sealed class Empleado : Persona { private string _departamento.blogspot. Usar “sealed” simultáneamente con “abstract” produce un error. public int HorasAsignadas { get { return _horasAsignadas.cl/~psalinas/uml/mo delo. } set { _departamento = value.