Está en la página 1de 37

Programacin Orientada a Objetos con C#

Programacin Orientada a Objetos en C#


Unidad 3.- Herencia
Autor: Dr. Ramn Roque Hernndez http://ramonroque.com/Materias/pooTec.htm ramonroque@yahoo.com Colaborador: Ing. Bruno Lpez Takeyas, M.C. www.itnuevolaredo.edu.mx/takeyas takeyas@itnuevolaredo.edu.mx

Relaciones entre clases: Herencia, Composicin y Agregacin

Programacin Orientada a Objetos con C#

Herencia
Caracterstica de la POO que permite definir nuevas clases a partir de otras ya existentes.

Las clases existentes transmiten sus caractersticas.

Programacin Orientada a Objetos con C#

Herencia (cont.)
Puede usarse para:
Relaciones del tipo es un
Ejemplo: Un Gerente es un Empleado con caractersticas propias adicionales.

Objetivo: Reutilizacin de cdigo.

Herencia
Aparato_Electrodomestico
(Propiedades: Interruptor, CableElectrico Mtodos: Encender, Apagar)

Herendan caractersticas de Aparato_Electrodomestico e incorporan las suyas propias.

Lavadora
Propiedades: (Interruptor, CableElectrico, PerillaDeCiclosDeLavado, CapacidadDeCarga) Mtodos: (Encender, Apagar, LlenarConAgua, TirarAgua)

Televisin
Propiedades: (Interruptor, CableElectrico, BotonDeCanales, BotonDeVolumen) Mtodos: (Encender, Apagar, CambiarVolumen, CambiarCanal)

Programacin Orientada a Objetos con C#

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.

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

Programacin Orientada a Objetos con C#

Ejemplo de herencia
class Persona { . }

class Empleado:Persona { . }

class Estudiante:Persona { . }

class Administrador:Empleado { . }

class Profesor:Empleado { . } 9

Ejercicio
Se deben modelar dos clases con las siguientes caractersticas:
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

Programacin Orientada a Objetos con C#

Mal Diseo (No recomendable)


Modelarlas de manera independiente.
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) { } } 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) { } }

11

Diseo 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

Programacin Orientada a Objetos con C#

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) { } } 13 13

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(); } }

14

Programacin Orientada a Objetos con C#

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(); } 15 }

Secuencia de ejecucin de constructores 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

Programacin Orientada a Objetos con C#

Secuencia de ejecucin de constructores en la Herencia


Salida del programa Constructor de la clase A Constructor de la clase B Constructor de la clase C System.Object

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, despus el constructor de la clase B, y finalmente el constructor de la clase C

17

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(); } }

18

Programacin Orientada a Objetos con C#

Secuencia de ejecucin 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.

19

Invocando constructores 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(); } }

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 parntesis se especifican los parmetros requeridos.

20

Programacin Orientada a Objetos con C#

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; } } 21 }

ERROR!

Clases parametrizadas o genricas


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 numrica entera y en la escuela es una cadena.


22

Programacin Orientada a Objetos con C#

Clases parametrizadas o genricas (cont.)


Clases iguales (excepto en el tipo de dato de la clave)
Escuela

Empresa

23

Clases parametrizadas o genricas (cont.)


Disear una clase parametrizada que sirva para ambos casos:

24

Programacin Orientada a Objetos con C#

Codificacin de la clase parametrizada


class Persona<Tipo> // 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<int> Empleado = new Persona<int>();


Persona<string> Estudiante = new Persona<string>();

// Uso de los objetos

Empleado.Clave = int.Parse(txtClave.Text); Estudiante.Clave = txtClave.Text;


26

Programacin Orientada a Objetos con C#

Clases parametrizadas con varios tipos


Ejemplo: Una empresa y una escuela desean almacenar la clave y grupo de sus personas:
Clave: Entero String Nombre: Entero caracter

27

Clases parametrizadas con varios tipos


Clases iguales (excepto en los tipos de datos)
Escuela

Empresa

28

Programacin Orientada a Objetos con C#

Codificacin de la clase parametrizada con varios tipos


class Persona<Tipo1, Tipo2> // 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<int, int> Empleado = new Persona<int, int>();
Persona<string, char> Estudiante = new Persona<string, char>();

// 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#

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 namespace System.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 datos
32

Programacin Orientada a Objetos con C#

Estructuras de datos en C#

Coleccin (clase genrica) ArrayList Stack Queue List LinkedList

Estructura de datos Arreglos Pilas Colas Listas enlazadas simples 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#

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 <int> ListaSimpleEnteros; List <double> ListaReales;

35

Principales mtodos y propiedades de la clase genrica List


Mtodo 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 operacin 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

36

Programacin Orientada a Objetos con C#

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<Empleado> miEmpresa = new List<Empleado>();

El objeto miEmpresa es una lista genrica que almacena objetos de la clase Empleado
38

Programacin Orientada a Objetos con C#

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 miEmpleado.Nombre miEmpleado.Sueldo
= int.Parse(textBox1.Text); = textBox2.Text; = double.Parse(textBox3.Text);
40

Programacin Orientada a Objetos con C#

Insertar un empleado (agregar un nodo a la lista)


Insertar el empleado en la lista
miEmpresa.Add(miEmpleado);

Crear el dataGridView
dataGridView1.Columns.Add("Nmero", "Nmero"); 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

Iteradores
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) { }

42

Programacin Orientada a Objetos con C#

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 instrucciones incluidas en el cuerpo del ciclo para cada elemento 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#

Ejemplo de un iterador en una coleccin genrica 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 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#

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 foreach
47

Implementacin de un iterador a travs del mtodo GetEnumerator()


El mtodo GetEnumerator() devuelve una secuencia de valores del mismo tipo IEnumerator<T>. Utiliza la instruccin yield return para devolver cada elemento Utiliza la instruccin yield break para finalizar la iteracin (ciclo) cuando sea necesario.
48

Programacin Orientada a Objetos con C#

Ejemplo de GetEnumerator()
public IEnumerator GetEnumerator() { if(Arreglo.Tamao == 0) yield break; for(i=0; i<Arreglo.Tamao; i++) yield return Arreglo[i]; }
49

Asociacin entre clases

Composicin

Asociacin
Agregacin

50

Programacin Orientada a Objetos con C#

Grados de dependencia (cardinalidad o multiplicidad)


Representacin
1 1..1 0..1 M..N M,N * 0..* 1..*

Descripcin de la cardinalidad
Uno y slo uno Uno a uno Cero uno Desde M hasta N MN Cero muchos Cero muchos Uno muchos (al menos uno)
51

Ejemplos

52

Programacin Orientada a Objetos con C#

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#

Representacin de la composicin
Grficamente se representa colocando un rombo negro en el extremo de la clase constituida (parte del todo).

55

Composicin
Un objeto puede tener como miembro otro objeto definido previamente. Cuando un objeto se encuentra compuesto por otros objetos, 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 es que la clase del todo regularmente contiene un destructor para eliminar sus partes
56

Programacin Orientada a Objetos con C#

Composicin
ProcesosDeUsuario Impresion

class Impresion { public void Imprimir(string Titulo, string mensaje) { System.Console.WriteLine(Titulo.ToUpper()); System.Console.WriteLine(mensaje); } } class ProcesosDeUsuario Composicin { private Impresion imp; public void ImprimirInstrucciones() { imp = new Impresion(); imp.Imprimir("Bienvenido", "Presione Enter para continuar"); System.Console.ReadLine(); } } 57

Relacin 1..1 en Composicin

58

Programacin Orientada a Objetos con C#

Implementacin de relacin 1..1 en composicin


class Todo { // Atributo (objeto componente del Todo) private Parte Componente = new Parte(); // Mtodo para insertar un componente public void Insertar(Parte P) { Componente = P; } // Destructor (elimina el componente) ~Todo() { Componente = null; } }
59

Representacin de la relacin 1..1


objetoTodo
Atributos del objetoTodo objetoParte
Atributos del objetoParte Mtodos del objetoParte

Mtodos del objetoTodo

Un objeto de la clase del todo tiene dentro un objeto de la clase parte El objetoTodo tiene un objetoParte como atributo 60

Programacin Orientada a Objetos con C#

Relacin 1..* en Composicin

61

Implementacin de relacin 1..* en composicin


class Todo { // Atributo (lista de componentes del Todo)
private List<Parte> ListaComponentes = new List<Parte>();

// Mtodo para insertar una parte a la lista public void Insertar(Parte P) { ListaComponentes.Add(P); } // Destructor (elimina el componente) ~Todo() { ListaComponentes.Clear(); } }
62

Programacin Orientada a Objetos con C#

Representacin de la relacin 1..*


objetoTodo
Atributos del objetoTodo objetoParte
Atributos del objetoParte

objetoParte
Atributos del objetoParte

objetoParte
Atributos del objetoParte

Mtodos del objetoParte

Mtodos del objetoParte

Mtodos del objetoParte

Mtodos del objetoTodo

Un objeto de la clase del todo tiene dentro una coleccin de objetos de la clase parte El objetoTodo tiene una lista de objetoParte como atributo
63

Cmo recorrer todas las partes de la ListaComponentes?


Implementar un iterador por medio del mtodo GetEnumerator()

64

Programacin Orientada a Objetos con C#

Implementacin del iterador


class Todo { . . . . . . . . . public IEnumerator<Parte> GetEnumerator() { foreach (Parte p in ListaComponentes) yield return p; } }
65

Otra forma de implementacin del iterador


class Todo { . . . . . . . . . public IEnumerator<Parte> GetEnumerator() { return ListaComponentes.GetEnumerator(); } }
66

Programacin Orientada a Objetos con C#

Composicin vs. Herencia


Usar Herencia Cuando Se desee incorporar en la clase las variables, propiedades y mtodos de otra clase. Se desee especializar una clase (agregando caractersticas especficas). Se desee ocultar, o encapsular un objeto bajo una nueva interfaz. Un objeto contenga otro objeto.

(Es un)

Composicin

(Tiene un o unos)

67

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 68 sus" partes"

Programacin Orientada a Objetos con C#

Representacin de la agregacin
Grficamente se representa colocando un rombo blanco en el extremo de la clase constituida (parte del todo).

69

Agregacin vs. 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

70

Programacin Orientada a Objetos con C#

Agregacin vs. Herencia


b) AGREGACIN
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


objetoB . objetoA . var1 var2 var3 var4 var5

71

Composicin vs. Agregacin


Criterio de comparacin Es una relacin 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 tambin se eliminan sus partes La clase del todo contiene atributo(s) que representa(n) las partes La clase del todo contiene mtodo(s) para insertar sus partes La clase del todo tiene un destructor para eliminar sus partes Composicin Agregacin


72

Programacin Orientada a Objetos con C#

Referencias adicionales
http://www.dcc.uchile.cl/~psalinas/uml/mo delo.html http://arodm.blogspot.com/2008/09/umlrelaciones-compocicion-agregacion.html

73