You are on page 1of 36

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 Administrador:Empleado
{
.
}

class Estudiante:Persona
{
.
}

class Profesor:Empleado
{
.
}
9

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

Programacin Orientada a Objetos con C#

Mal Diseo
(No 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

Diseo usando 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

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

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.

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 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) Estructura de datos


ArrayList
Arreglos
Stack
Pilas
Queue
Colas
List
Listas enlazadas simples
LinkedList
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

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 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 lista

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

Descripcin de la cardinalidad
Uno y slo uno

1..1

Uno a uno

0..1

Cero uno

M..N

Desde M hasta N

M,N

MN

Cero muchos

0..*

Cero muchos

1..*

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

objetoParte

objetoParte

Atributos del
objetoParte

Atributos del
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

(Es un)

Composicin

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.

(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

Composicin

Agregacin

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

You might also like