Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
Herencia, Composición
y Agregación
2
Programación Orientada a Objetos con C#
Herencia
4
Programación Orientada a Objetos con C#
Herencia (cont.)
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.
Herencia en C#
• Ejemplo de Herencia en C#
class A
Indica que B “Hereda de” A
{
}
class B : A
{
}
Ejemplo de herencia
class Persona
{
….
}
class Empleado:Persona
class Estudiante:Persona
{ {
…. ….
} }
class Administrador:Empleado
{
….
}
class Profesor:Empleado
{
….
}
9
Ejercicio
Automovil PalaMecanica
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
Automovil PalaMecanica
12
Programación Orientada a Objetos con C#
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
17
18
Programación Orientada a Objetos con C#
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
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
Clases parametrizadas o
genéricas (cont.)
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
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#
27
28
Programación Orientada a Objetos con C#
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
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();
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");
Iteradores
El ciclo foreach
38
Programación Orientada a Objetos con C#
39
40
Programación Orientada a Objetos con C#
El método GetEnumerator()
• Lo contiene System.Collections
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()
Composición
Asociación
Agregación
44
Programación Orientada a Objetos con C#
Grados de dependencia
(cardinalidad o multiplicidad)
45
Ejemplos
46
Programación Orientada a Objetos con C#
Composición
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.
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();
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>();
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
Usar… Cuando…
58
Programación Orientada a Objetos con C#
Agregación
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#
61
62
Programación Orientada a Objetos con C#
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