Sei sulla pagina 1di 33

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

Relaciones entre clases:

Herencia, Composición
y Agregación

2
Programación Orientada a Objetos con C#

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.

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

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

Lavadora Televisión
• Propiedades: • Propiedades:
(Interruptor, CableElectrico, (Interruptor, CableElectrico,
PerillaDeCiclosDeLavado, CapacidadDeCarga) BotonDeCanales, BotonDeVolumen)
• Métodos: • Métodos:
(Encender, Apagar, (Encender, Apagar,
LlenarConAgua, TirarAgua) CambiarVolumen, CambiarCanal)
6
Programación Orientada a Objetos con C#

Uso de la Herencia

• Beneficios:
– Permte escribir menos código.
– Mejora la reusabilidad de los componentes.
– Facilita el mantenimiento del sistema completo.

• Util para un buen diseño del programa.

• Un diseño pobre sin herencia implementaría las


clases involucradas de manera independiente.

Herencia en C#

• En C# solo se permite Herencia simple.

• Ejemplo de Herencia en C#

class A
Indica que B “Hereda de” A
{
}
class B : A
{
}

• Todos los objetos heredan de System.Object


8
Programación 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


características:

Automovil PalaMecanica

CaballosDeFuerza: int CaballosDeFuerza: int


CantidadDePuertas: int PesoMaximoDeLevante: int

Arrancar() : void Arrancar() : void


Detener() : void Detener() : void
Acelerar(int cuanto): void MoverPala(string direccion) : void

10
Programación Orientada a Objetos con C#

Mal Diseño
(No recomendable)
• Modelarlas de manera independiente.
class Automovil class PalaMecanica
{ {
private int cf, cp; private int cf, pml;
public int CaballosDeFuerza public int CaballosDeFuerza
{ {
get { return cf; } Iguales get { return cf; }
set { cf = value; } set { cf = value; }
} }
public int CantidadDePuertas public int PesoMaximoDeLevante
{ {
get { return cp; } get { return pml; }
set { cp = value; } set { pml = value; }
} }
public void Arrancar() public void Arrancar()
{ Iguales {
} }
public void Detener() public void Detener()
{ Iguales {
} }
public void Acelerar(int cuanto) public void MoverPala(string direccion)
{ {
} }
} }
11

Diseño usando Herencia


(Recomendado)
Vehiculo
Superclase
(Clase base)
CaballosDeFuerza : int
(Clase padre)
(Clase madre)
Arrancar() : void
Detener() : void
Subclases
Herencia
(Clases derivadas)
(Clases Hijas)

Automovil PalaMecanica

CantidadDePuertas : int PesoMaximoDeLevante : int

Acelerar(int cuanto) : void MoverPala(string direccion) : void

12
Programación Orientada a Objetos con C#

Diseño 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 class PalaMecanica : Vehiculo


{ private int cp; {
public int CantidadDePuertas private int pml;
{ get { return cp; } public int PesoMaximoDeLevante
set { cp = value; } {
} get { return pml; }
public void Acelerar(int cuanto) set { pml = value; }
{ }
} public void MoverPala(string direccion)
} {
}
} 13

Notas sobre el ejemplo…


• Todas las variables, métodos y propiedades que no sean privadas, serán
heredadas.
• Los elementos heredados se accesan igual que si estuvieran presentes en
esa clase.

class Programa
{
static void Main()
{
Automovil unAuto = new Automovil();
unAuto.Arrancar();
unAuto.Acelerar(10);
unAuto.Detener();
PalaMecanica unaPala = new PalaMecanica();
unaPala.Arrancar();
unaPala.MoverPala ("arriba");
unaPala.Detener();
System.Console.ReadLine();
}
} 14
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”.
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 ejecución 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
Programación Orientada a Objetos con C#

Secuencia de ejecución de
constructores en la Herencia
Salida del programa…

System.Object
Constructor de la clase A
Constructor de la clase B
Constructor de la clase C
A

Al crear una instancia de C,


Primero se ejecuta el constructor de la
B
clase padre (Que en realidad siempre es
Object), luego el constructor de la clase
“A”, después el constructor de la clase
“B”, y finalmente el constructor de la C
clase “C”

17

Secuencia de ejecución 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 programa
} {
class B : A static void Main()
{ public B()
{ System.Console.WriteLine("Constructor de la clase B");
{
} C miObjetoC = new C();
~B() miObjetoC = null;
{ System.Console.WriteLine("Destructor de la clase B"); GC.Collect();
} Console.ReadKey();
} }
class C : B
{ public C()
}
{ System.Console.WriteLine("Constructor de la clase C ");
}
~C()
{ System.Console.WriteLine("Destructor de la clase C");
}
}

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

19

Invocando constructores de
la clase base
class Punto
{
public int x, y; La salida del
public Punto(int puntoX, int puntoY)
{ x = puntoX;
programa es…
y = puntoY;
} X=1 Y=2 R =1
}
class Circulo : Punto
{
public double r;
public Circulo(int coordX, int coordY, double radio)
:base (coordX, coordY) La palabra reservada base( )
{ hace referencia a la clase
r = radio; padre inmediata desde la
} cual se invoca.
public string ConsultarDatos()
{
Entre paréntesis se
return string.Format("X={0} Y={1} R ={2} ",x,y,r); especifican
} los parámetros requeridos.
}
class Programa
{
public static void Main()
{
Circulo c = new Circulo(1, 2, 1);
System.Console.WriteLine(c.ConsultarDatos());
System.Console.ReadLine(); 20
}
}
Programación Orientada a Objetos con C#

Clases parametrizadas o
genéricas

• Ejemplo: Una empresa y una escuela


desean almacenar la clave y nombre de
sus personas:
– Clave: Entero ó String
– Nombre: String
• Pero en la empresa la clave es
numérica entera y en la escuela es una
cadena.
21

Clases parametrizadas o
genéricas (cont.)

• Clases iguales (excepto en el tipo de


dato de la clave)

Escuela

Empresa

22
Programación Orientada a Objetos con C#

Clases parametrizadas o
genéricas (cont.)
• Diseñar una clase parametrizada que
sirva para ambos casos:

23

Clases parametrizadas o
genéricas (cont.)
// Declaración y creación de los objetos

Persona Empleado = new Persona<int>();


Persona Estudiante = new Persona<string>();

// Uso de los objetos

Empleado.Clave = 5;
Estudiante.Clave = "M99123";
24
Programación Orientada a Objetos con C#

Clases parametrizadas o
genéricas (cont.)
Lecturas complementarias:
• http://www.desarrolloweb.com/
articulos/generics-c.html
• Capítulo 13 (Tipos y métodos
genéricos) del libro
«Microsoft C#. Curso de
Programación. 2ª. ed»

25

Colecciones genéricas en C#

• Incluidas en el namespace
System.Collection.Generic
• Incorporadas a partir del .NET
Framework 2.0
• Contiene clases e interfaces que
definen tipos genéricos para instanciar
colecciones
• Permite modelar estructuras de datos
26
Programación Orientada a Objetos con C#

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

27

Listas enlazadas simples

• Estructura de datos compuesta de nodos en


secuencia enlazados a través de una referencia
(apuntador).
• Cada nodo se compone de 2 partes:
– Datos
– Referencia al siguiente nodo
• Además, hay una referencia al primer nodo de
la lista y el último nodo apunta a nulo

28
Programación Orientada a Objetos con C#

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

29

Principales métodos y
propiedades de la clase
genérica List
Método o propiedad Uso
Clear Elimina todos los nodos de la lista
Add Agrega un nodo al final de la lista
Remove Elimina la primera ocurrencia de un nodo de la
lista y devuelve un valor booleano para confirmar
la operación
Contains Determina si un nodo se encuentra almacenado
en la lista
Count Devuelve la cantidad de nodos almacenados en
la lista
Sort Ordena en forma ascendente los nodos de la lista

30
Programación 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
31

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

• El objeto miEmpresa es una lista genérica


que almacena objetos de la clase
Empleado
32
Programación Orientada a Objetos con C#

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, crear un
objeto de la clase
Empleado e insertarlo
en la lista genérica
• Mostrar los datos en
un dataGridView
33

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

• Llenar los datos del empleado


– miEmpleado.Numero = int.Parse(textBox1.Text);
– miEmpleado.Nombre = textBox2.Text;
– miEmpleado.Sueldo = double.Parse(textBox3.Text);

34
Programación 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("Número", "Número");
dataGridView1.Columns.Add("Nombre", "Nombre");
dataGridView1.Columns.Add("Sueldo", "Sueldo");

// Inicializa las propiedades del dataGridView1


dataGridView1.ReadOnly = true;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.AutoSizeColumnsMode =
DataGridViewAutoSizeColumnsMode.Fill;
35

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)
{
……
36
}
Programación Orientada a Objetos con C#

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

Uso de un iterador para


limpiar los textBoxes
foreach(Control x in groupBox1.Controls)
if(x is TextBox)
x.Text=“”;

38
Programación Orientada a Objetos con C#

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

39

Mostrar los datos de una


lista en un dataGridView
foreach(Empleado miEmpleado in miEmpresa)
{
dataGridView1.Rows.Add(miEmpleado.Numero,
miEmpleado.Nombre, miEmpleado.Sueldo)
}

40
Programación Orientada a Objetos con C#

El método GetEnumerator()

• Sirve para implementar iteradores


• El método GetEnumerator()
devuelve un enumerador que recorre en
iteraciones una colección.

• Lo contiene System.Collections

• Se utiliza por medio del ciclo foreach


41

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>.
• 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.
42
Programación Orientada a Objetos con C#

Ejemplo de
GetEnumerator()

public IEnumerator GetEnumerator()


{
if(Arreglo.Tamaño == 0)
yield break;
for(i=0; i<Arreglo.Tamaño; i++)
yield return Arreglo[i];
}
43

Asociación entre clases

Composición
Asociación
Agregación

44
Programación Orientada a Objetos con C#

Grados de dependencia
(cardinalidad o multiplicidad)

Representación Descripción de la cardinalidad


1 Uno y sólo uno
1..1 Uno a uno
0..1 Cero ó uno
M..N Desde M hasta N
M,N MóN
* Cero ó muchos
0..* Cero ó muchos
1..* Uno ó muchos (al menos uno)

45

Ejemplos

46
Programación Orientada a Objetos con C#

Composición

• Define una relación fuerte entre clases


• Se utiliza para modelar un " todo" y sus
" partes " donde …
– El " todo" no puede existir si no existen sus "
partes"
– Las " partes" desaparecen cuando se elimina el
" todo "

47

48
Programación Orientada a Objetos con C#

Representación de la
composición
• Gráficamente se representa colocando un
rombo negro en el extremo de la clase
constituida (parte del “todo”).

49

Composición
• Un objeto puede tener como miembro otro objeto
definido previamente.

• Cuando un objeto se encuentra compuesto por otros


objetos, se dice que hay “Composición”.

• La composición permite implementar relaciones del


tipo “tiene un”.
– Ejemplo: Un Auto “tiene un” Motor.
• Una característica importante de la composición es
que la clase del “todo” regularmente contiene un
destructor para eliminar sus “partes”
50
Programación Orientada a Objetos con C#

Composición

ProcesosDeUsuario Impresion

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

Relación 1..1 en
Composición

52
Programación Orientada a Objetos con C#

Implementación de relación
1..1 en composición
class Todo
{
// Atributo (objeto componente del Todo)
private Parte Componente = new Parte();

// Método para insertar un componente


public void Insertar(Parte P) {
Componente = P;
}
// Destructor (elimina el componente)
~Todo() {
Componente = null;
}
53
}

Representación de la
relación 1..1

objetoTodo • Un objeto de la
Atributos del objetoTodo
clase del “todo”
objetoParte
tiene dentro un
Atributos del
objeto de la clase
objetoParte “parte”
Métodos del
objetoParte
• El objetoTodo
tiene un
Métodos del objetoTodo objetoParte como
atributo 54
Programación Orientada a Objetos con C#

Relación 1..* en
Composición

55

Implementación de relación
1..* en composición
class Todo
{
// Atributo (lista de componentes del Todo)
private List<Parte> ListaComponentes = new List<Parte>();

// Método para insertar una parte a la lista


public void Insertar(Parte P) {
ListaComponentes.Add(P);
}
// Destructor (elimina el componente)
~Todo() {
ListaComponentes.Clear();
}
56
}
Programación Orientada a Objetos con C#

Representación de la
relación 1..*
• Un objeto de
objetoTodo la clase del
“todo” tiene
Atributos del objetoTodo
dentro una
objetoParte objetoParte objetoParte colección de
objetos de la
Atributos del Atributos del Atributos del
objetoParte objetoParte objetoParte
clase “parte”
• El objetoTodo
Métodos del Métodos del Métodos del tiene una lista
objetoParte objetoParte objetoParte de
objetoParte
Métodos del objetoTodo como atributo
57

Composición vs. Herencia

Usar… Cuando…

Herencia • Se desee incorporar en la clase las variables,


propiedades y métodos de otra clase.
• Se desee especializar una clase (agregando
(Es un…) características específicas).

Composición • Se desee ocultar, o encapsular un objeto bajo


una nueva interfaz.
• Un objeto contenga otro objeto.
(Tiene un o unos…)

58
Programación Orientada a Objetos con C#

Agregación

• Define una relación donde una clase se


puede formar de otras clases
• Sin embargo, la existencia de objetos de
dichas clases es independiente
• Se utiliza para modelar un " todo" y sus "
partes " donde …
– El " todo" se forma agregando sus" partes"
– Las " partes" pueden pertenecer a varios " todos "
– Si se elimina el " todo" pueden seguir existiendo
sus" partes" 59

Representación de la
agregación
• Gráficamente se representa colocando un
rombo blanco en el extremo de la clase
constituida (parte del “todo”).

60
Programación Orientada a Objetos con C#

Agregación vs. Herencia


a) HERENCIA
class A Mapa de memoria para objetoB
{ public int var1;
public int var2; objetoB . var1
public int var3;
}
class B : A var2
{ public int var4;
public int var5;
var3
}
class Programa
{ static void Main() var4
{ B objetoB = new B();
objetoB.
} var5
}

61

Agregación vs. Herencia


b) AGREGACIÓN
class A Mapa de memoria para objetoB
{ public int var1;
public int var2; objetoB . objetoA . var1
public int var3;
}
class B var2
{ public A objetoA = new A();
public int var4;
var3
public int var5;
}
class Programa var4
{ static void Main()
{ B objetoB = new B();
objetoB. var5
}
}

62
Programación Orientada a Objetos con C#

Composición vs. Agregación


Criterio de comparación Composición Agregación

Es una relación entre clases de un «todo» y sus


«partes»
El «todo» depende de la existencia de sus «partes»

Las «partes» pueden pertenecer a varios «todos»

Si se elimina el «todo» también se eliminan sus


«partes»
La clase del «todo» contiene atributo(s) que
representa(n) las «partes»
La clase del «todo» contiene método(s) para insertar
sus «partes»
La clase del «todo» tiene un destructor para eliminar
sus «partes»

63

Evitando la herencia:
Clases sealed
• Las clases sealed class Persona
(selladas) pueden { private string _nombre;
ser instanciadas public string Nombre
{ get { return _nombre; }
pero NO heredadas. set { _nombre = value; }
• Se utiliza la palabra }
“sealed” para }
indicarlo. sealed class Empleado : Persona
{ private string _departamento;
• Usar “sealed” public string Departamento
simultáneamente { get { return _departamento; }
con “abstract” set { _departamento = value; }
produce un error. }
}
class EmpleadoTiempoParcial:Empleado
{ private int _horasAsignadas;
public int HorasAsignadas
ERROR! { get { return _horasAsignadas; }
set { _horasAsignadas = value; }
} 64
}
Programación Orientada a Objetos con C#

Referencias adicionales

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

65

Potrebbero piacerti anche