You are on page 1of 41

Diseo y Programacin

Orientada a Objetos
Herencia
TEMA # 2: Herencia y Polimorfismo
Profesor: MSc. Jos Luis Alonso
Correo: jl.alonso@ce.pucmm.edu.do

Contenido 1ra parte

Herencia
Relaciones que la definen
Representacin en UML
Implementacin en Java

Categoras de objetos
Persona
Persona
Comerciante
Comerciante
Florista
Florista

Objetos
de una
categora

Animal
Animal
Mamfero
Mamfero
Cnido
Cnido
Perro Lobo
Perro

Lobo

iguales caractersticas
igual comportamiento

Relaciones de herencia
Esun o es-un-tipo-de: presente
entre dos conceptos cuando uno es
un ejemplar especializado del otro.
Ejemplos:
Un Perro es un Mamfero
Un Crculo es una Figura
Generalizacin/especializacin

Herencia
Forma de reutilizacin del software.
Se crean nuevas clases (hijas,
derivadas) a partir de clases
existentes (base, ancestros).
A travs de la herencia las clases
derivadas "heredan", o sea, tienen
acceso a los datos y comportamiento de la clase base.

Reperesentacin en UML
A

Generalaizacin/
especializacin
C

Propiedades
No conmutativa
Transitiva
Extensiva

Herencia reutilizacin
clase derivada hereda todas las
caractersticas y comportamiento,
datos y mtodos, de sus ancestros
directos e indirectos.
clase derivada puede agregar nuevas
caractersticas y comportamiento,
datos y mtodos.
clase derivada puede redefinir el
comportamiento, mtodos.

Estudiante
Estudiante
nombre
notas
NI
carrera
notas
carrera
carrera()

nombre()

Persona
Ejemplo
nombre
NI
nombre() Administrador
Profesor
nombre
Administrador
NI
Profesor
nombre
dpto
dpto
NI
dpto
salario
salario
dpto
salario
horario
salario
horario
categora
categora
nombre()
salario()
salario()
horario()
nombre()
horario()
categ()

Ejemplo

Persona
nombre
NI
nombre()

Trabajador
dpto
salario
salario()

Estudiante
notas
carrera
Profesor Administrador
carrera()

categora
horario
categ()
horario()

Implementacin en Java
class Object
Clase predefinida
Padre de toda la jerarqua de
clases
Ancestro directo o indirecto de
todas las clases

Implementacin en Java
public 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){..
}

Construccin de objetos de
clases derivadas
public Worker(String name, String
NI, String depart, float
salary) {
Person()
super(name,NI);
this.depart= depart;
this.salary= salary;
}
Teacher()?

Otro uso de super


Para acceder a la versin heredada de un
miembro redefinido.
Sintaxis:

super.miembro

Dato

Mtodo

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;

Miembros protegidos
public class Teacher extends Worker
{
public void incExperience(float
amount) {
salary= salary + amount;
}

Visibilidad en
jerarquas de clases
Los atributos y mtodos se heredan
con el mismo nivel de visibilidad que
fueron declarados en la clase padre.
Este nivel de visibilidad puede ser
aumentado, a travs de la
redefinicin pero nunca restringido.

Mecanismo del compilador


para responder a un mensaje

Ejemplo
Student
marks
course
getCourse()

Person
name
NI
getName()

Object
Worker
dpto
salary
getSalary()

Teacher
Admin a, b;
Admin
a = new Admin(..) category schedule
a.getName() getCateg() getSchedule()
b= a.clone();

Contenido 2da parte


Otras relaciones entre clases.
Compatibilidad de tipos para la
asignacin.
Conversin implcita o hacia arriba
Conversin explcita o hacia abajo

Otras relaciones
Utiliza-un: cuando un objeto colabora
con otro para llevar a cabo algunas
funciones. En la implementacin, no es
ms que funciones miembros del objeto
cliente, que acceden a un objeto servidor
al cual se le hacen solicitudes en el
cuerpo de la funcin.
Ejemplos:
Persona utiliza un automvil
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
implementacin, no es ms 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
B

A
1

1
Solicita hora

Jugada

Reloj

Compatibilidad de tipos
para la asignacin

Conversin implcita o
hacia arriba
Herencia Es-un
Instancia de clase derivada es una
instancia de clase base
Una instancia es compatible para la asignacin, 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.

Ejemplo
Person p;
Student s= new Student(Juan,

80010111111, DPOO);

p= s;

Donde cabe un padre


cabe cualquiera de sus
hijos

Conversin explcita o
hacia abajo
s= p

ERROR!!!

s= (Student)p;
TypeCast

Utilidad de la conversin
hacia arriba
public class PersonCollection {
private Person[] persons;
private int count;

Utilidad de la conversin
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 conversin
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 instanceof
public 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 cdigo. Permite implementar nuevas
clases en funcin de otras ya existentes.
Al disear los modelos de clases: analizar
cada uno de los conceptos del problema
buscando caractersticas y comportamiento comn, para crear clases ancestrales.

Conclusiones
Muchas veces se disean clases de las
cuales no existirn ejemplares, y cuya
nica razn de ser es aportar caractersticas y comportamiento para la herencia.
Clases descendientes que no incorporan
nuevo comportamiento ni redefinen el
comportamiento heredado de sus
ancestros son indeseadas.

Motivacin
Student
marks
course

Person
name
NI
getName()

Worker
dpto
salary
getSalary()

pay()

getCourse()

Person p;
p = new Admin(..)
p.pay()?

Teacher
category

Admin
hour

getCateg()

getHour()

pay()

pay()

Estudio Independiente
Bibliografa: Texto bsico. Captulo 6:
Reusing Classes.
Inheritance syntax. Pg 261.
Initializing the base class. Pg 264
Combining composition and
inheritance. Pg 267.
protected. Pg 276.

Estudio Independiente
Caso de estudio: Control de las
publicaciones de una biblioteca.

You might also like