Post on 12-Feb-2017
Diseño y Programación Orientada a Objetos
HerenciaTEMA # 2: Herencia y Polimorfismo
Profesor: MSc. José Luis AlonsoCorreo: jl.alonso@ce.pucmm.edu.do
Contenido 1ra parte• Herencia• Relaciones que la definen• Representación en UML• Implementación en Java
Categorías de objetos Animal
Mamífero
Cánido
Perro Lobo
PersonaComerciante
Florista
•iguales características•igual comportamiento
Objetos de una
categoría
Animal
Mamífero
Cánido
Perro Lobo
Persona
Comerciante
Florista
Relaciones de herenciaEs–un o es-un-tipo-de: presente entre dos conceptos cuando uno es un ejemplar especializado del otro. Ejemplos:• Un Perro es un Mamífero• Un Círculo es una Figura
Generalización/especialización
HerenciaForma de reutilización del software. Se crean nuevas clases (hijas, derivadas) a partir de clases existentes (base, ancestros).A través de la herencia las clases derivadas "heredan", o sea, tienen acceso a los datos y comporta-miento de la clase base.
Reperesentación en UML
Propiedades • No conmutativa• Transitiva • Extensiva
Generalaización/especialización
A
B C
D
Herencia reutilización• clase derivada hereda todas las
características y comportamiento, datos y métodos, de sus ancestros directos e indirectos.
• clase derivada puede agregar nuevas características y comportamiento, datos y métodos.
• clase derivada puede redefinir el comportamiento, métodos.
Administradornombre
NIdpto
salario
nombre() …
horario
horario()
Estudiante
carrera
nombreNI
notas
nombre() …
Profesornombre
dptosalario
NI
categoríanombre() …
EjemploPersonanombre
NInombre()
carrera
Estudiantenotas
…
Administradordpto
salario
salario() …
carrera()
Profesordpto
salariocategoría
…salario()categ()
horario
horario()
EjemploPersonanombre
NInombre()
carrera
Estudiantenotas
…carrera()
Trabajadordptosalario
salario()…
Profesorcategoríacateg()
Administradorhorariohorario()
Implementación en Javaclass Object
• Clase predefinida• Padre de toda la jerarquía de
clases• Ancestro directo o indirecto de
todas las clases
Implementación en Javapublic class Person {
private String name;private String NI;public Person(String name,String NI){..public String getName(){..public String getNI(){..public void setName(String name){..public void setNI(String NI){..public int age(){..
}
public class Student extends Person {private String course;private IntArray marks;public Student(String name, String NI,
String course) {..public String getCourse(){..public void setCourse(String course){..public void addMark(int mark){..public float average(){..
}
public class Worker extends Person {private String depart;private float salary;public Worker(String name, String NI,
String dpto, float salary) {..public String getDpto(){..public void setDpto(String course){..public String getSalary(){..public void setSalary(float salary){..
}
public class Teacher extends Worker {private String category;public Teacher(String name, String NI,
String depart, float salary, String category) {..
public String getCategory(){..public void setCategory(String
category){..}
public class Admin extends Worker {private String schedule;public Admin(String name, String NI,
String depart, float salary, String schedule) {..
public String getSchedule(){..public void setSchedule(String
schedule){..}
Construcción de objetos de clases derivadas
public Worker(String name, String NI, String depart, float
salary) {super(name,NI); this.depart= depart;this.salary= salary;}
Person(…)
¿Teacher(…)?
Otro uso de super• Para acceder a la versión heredada de un
miembro redefinido.• Sintaxis:
super.miembro
Dato Método
Miembros protegidos• protected• Pueden ser accedidos por la clase y
sus derivadas, directas e indirectas.public class Worker extends Person
{private String depart;protected float salary;…
}
public class Teacher extends Worker { …
public void incExperience(float amount) {
salary= salary + amount; }…}
Miembros protegidos
Visibilidad en jerarquías de clases
Los atributos y métodos se heredan con el mismo nivel de visibilidad que fueron declarados en la clase padre. Este nivel de visibilidad puede ser aumentado, a través de la redefinición pero nunca restringido.
Mecanismo del compilador para responder a un mensaje
Ejemplo Personname
NIgetName()course
Studentmarks
…getCourse()
Workerdptosalary
getSalary()…
TeachercategorygetCateg()
Adminschedule
getSchedule()
Admin a, b;a = new Admin(..)…a.getName()…b= a.clone();
Object
Contenido 2da parte• Otras relaciones entre clases. • Compatibilidad de tipos para la
asignación. –Conversión implícita o hacia arriba–Conversión explícita o hacia abajo
Otras relaciones …Utiliza-un: cuando un objeto colabora con otro para llevar a cabo algunas funciones. En la implementación, no es más que funciones miembros del objeto cliente, que acceden a un objeto servidor al cual se le hacen solicitudes en el cuerpo de la función.Ejemplos:• Persona utiliza un automóvil• Estudiante utiliza una PC
Otras relaciones …Conoce-un o conoce-a: cuando un objeto, en cualquier momento de su vida, conoce de la existencia de otro objeto de otra clase. En la implementación, no es más que un miembro del objeto conocedor, que “apunta” al objeto conocido.Ejemplos:• Estudiante conoce a su(s) profesor(es)• Jugada, Jugador conocen a reloj.
“Utiliza-un” y “Conoce-a”A B
1 1
Jugada RelojSolicita hora
1 1
Compatibilidad de tipos para la asignación
Conversión implícita o hacia arriba
• Herencia “Es-un”• Instancia de clase derivada es una
instancia de clase base• Una instancia es compatible para la asig-
nación, con cualquiera de sus ancestros. • Una instancia puede referenciar una
instancia de cualquier tipo descendiente. • Lo contrario no es posible, una instancia
de clase base nunca es una instancia de clase derivada.
EjemploPerson p;Student s= new Student(“Juan”,
“80010111111”, “DPOO”);p= s;
“Donde cabe un padre cabe cualquiera de sus
hijos”
s= p
Conversión explícita o hacia abajo
ERROR!!!
s= (Student)p;
TypeCast
Utilidad de la conversión hacia arriba
public class PersonCollection {private Person[] persons;private int count;…
Utilidad de la conversión hacia arriba
public boolean add(Person person) {
… persons[count++]= person; …}
public class Controler {private PersonCollection persons;…public boolean addAdmin(String name;..){ Admin a= new Admin(name,…); persons.add(a); }public boolean addTeacher(String name;..){ Teacher t= new Teacher(name,…); persons.add(t); }…}
Utilidad de la conversión hacia arriba
public int find(String name) { …
if(persons[i].getName().equalsIgnoreCase(name));
…}
…}
Instancias de clases derivadas tratadas como instancias de
clase base
Operador instanceof• Permite conocer de qué tipo de clase es un
objeto.• Sintaxis
<instancia> instanceof <clase>
Operador instanceofpublic class PersonCollection { private Person[] persons; … public int countAdmin() { int c= 0; for (int i= 0;i < count; i++) if (persons[i] instanceof Admin) c++; return c; } …}
Conclusiones• Herencia: mecanismo de la POO que
garantiza el mayor nivel de reusabilidad de código. Permite implementar nuevas clases en función de otras ya existentes.
• Al diseñar los modelos de clases: analizar cada uno de los conceptos del problema buscando características y comportamien-to común, para crear clases ancestrales.
Conclusiones• Muchas veces se diseñan clases de las
cuales no existirán ejemplares, y cuya única razón de ser es aportar caracterís-ticas y comportamiento para la herencia.
• Clases descendientes que no incorporan nuevo comportamiento ni redefinen el comportamiento heredado de sus ancestros son indeseadas.
Motivación Personname
NIgetName()course
Studentmarks
…getCourse()
Workerdptosalary
getSalary()
TeachercategorygetCateg()
Adminhour
getHour()
Person p;p = new Admin(..)¿…p.pay()…?
pay()
pay() pay()
Estudio Independiente• Bibliografía: Texto básico. Capítulo 6:
Reusing Classes. –Inheritance syntax. Pág 261.–Initializing the base class. Pág 264–Combining composition and
inheritance. Pág 267.–protected. Pág 276.
Estudio Independiente• Caso de estudio: Control de las
publicaciones de una biblioteca.