Professional Documents
Culture Documents
2
Competencias Teóricas
3
Competencias prácticas
4
Reutilización de código
5
Reutilización de código
6
Empleados, Comerciales y
Administrativos
En una empresa hay empleados, algunos de los cuales son comerciales,
otros administrativos, etc. Todos los empleados tienen un nombre y un
departamento, pero los comerciales tienen además unas ventas y unos
porcentajes; los administrativos están asociados a un Servicio, etc.
8
Derivación por herencia
class Derivada extends ClaseBase {
9
Diagrama
10
DEMO
Proyecto: SintaxisDeLaHerenciaEnJava
11
Observaciones
12
Observaciones
13
Observaciones
• Los ctores de Comercial invocan explícitamente a
los ctores de Empleado, empleando la sintaxis :
super(arg_1, arg_2).
• Obsérvese que el constructor de Empleado que se
invoca depende del tipo de los argumentos.
• En todos los casos se da valor a las ventas mediante
setVentas(). Esto hace posible validar el valor de
ventas, impidiendo que un ctor pueda darle un valor
negativo. Obsérvese que este método puede lanzar
una excepción, que se captura en main().
14
Observaciones
• Por comodidad y seguridad, lo más frecuente es
declarar public únicamente los servicios que deben
quedar al alcance de otras; los atributos (y los
servicios privados) se declaran private.
• Puede ser interesante asignar el modificador de
acceso protected a ciertas características de la
clase base si se desea limitar el acceso a un servicio a
las clases relacionadas por herencia con una cierta
clase base, sin ofrecerlo a otras clases.
15
Observaciones
16
Uso de public, protected y private
Especificador de acceso de la
Tipo de herencia
característica de la clase base
public en la clase derivada
public
18
Otros ejemplos
19
Observaciones
Los dos primeros proyectos resuelven de otra forma el problema de un
Empleado, suponiendo en el primer caso que trabaja a comisión, y en
el segundo que trabaja a sueldo mas comisión.
20
DEMO
Proyecto: Empleado_A_Comision_Java
21
DEMO
Proyecto: Empleado_A_Sueldo_Mas_Comision_Java
22
DEMO
Proyecto: ConstructoresYHerenciaEnJava
23
Herencia y descriptores
El uso de punteros para acceder a clases relacionadas por herencia
cumple dos reglas relativamente sencillas:
Se puede asignar la dirección de un ejemplar de clase
DERIVADA a cualquier puntero de una clase PREDECESORA
(porque la clase derivada “es_un” ejemplar de la predecesora,
todo Coche “es_un” Vehiculo).
No se puede asignar la dirección de un ejemplar de clase
PREDECESORA a un puntero de alguna clase DERIVADA (no es
cierto que todo Vehiculo “es_un” Coche).
24
Diagrama
25
DEMO
Proyecto: PunterosYHerenciaEnJava
26
PunterosYHerenciaJava
pDDD.metodo_clase_base();
pDDD.metodo_clase_derivada();
pDDD.metodo_clase_derivada_derivada();
pDDD.metodod_clase_derivada_derivada_derivada();
}
}
27
PunterosYHerenciaJava
run:
Caso de un pBase que apunta a una ClaseDerivadaDerivadaDerivada:
28
Métodos redefinidos
• Aunque no se conozca de antemano la
existencia de una clase derivada, que se creará
en el futuro, basta asignar la dirección de un
objeto de la clase DERIVADA a un puntero de
la clase BASE para que el entorno busque y
ejecute el método virtual (abstracto, en Java) de
la clase DERIVADA.
• Es como un switch() basado en el TIPO.
29
Métodos abstractos
• Cuando un método carece de cuerpo, esto es, cuando un
método tiene como cuerpo un “;” se dice que el método es
abstracto.
• Todo clase que posea un método abstracto se denomina
abstracta, y no se pueden crear ejemplares de esa clase (no se
puede instanciar).
• Es posible crear descriptores de una clase abstracta.
• Es posible crear una clase derivada por herencia de una clase
abstracta. Si la clase derivada implementa todos los métodos
abstractos de la clase base, pasa a ser concreta y se puede
instanciar. Si no los implementa, también es abstracta.
30
Métodos abstractos
31
Métodos abstractos
32
Diagrama
33
DEMO
Proyecto: MetodosAbstractosJava
34
interfaces en Java
• Considérese una clase tal que:
• Todos sus atributos son constantes, con los modificadores
public static final (se pueden omitir los
modificadores, el compilador los añade efectivamente).
• Todos sus métodos son abstractos, con los modificadores
public abstract (se pueden omitir los
modificadores, el compilador los añade efectivamente).
• Esto es una interface.
35
El tipo interface de Java
public interface Nombre [extends Interfaz1, Interfaz2,...InterfazQ]{
[public static final] tipo1 atributo1 = valor1;
...
[public static final] tipoM atributoN = valorP;
[public abstract] tipo nombreMetodo(argumentos);
...
[public abstract] tipo nombreMetodo(argumentos);
}
36
El tipo interface de Java
public interface DataBase{
void loadFrom(File f);
void saveTo(File f);
void exportTo(String destino);
void importFrom(String origen);
void add(String registro);
void remove(String registro);
void edit(String registro);
String[] report(String[] criterios);
}
• Esta interfaz debe ser implementada por una clase, que definirá todos sus
métodos. 37
El tipo interface de Java
public interface DataBase<T>{
void loadFrom(File f);
void saveTo(File f);
void exportTo(String destino);
void importFrom(String origen);
void add(T registro);
void remove(T registro);
void edit(T registro);
T[] report(String[] test);
}
Las interfaces, como las clases y los métodos, son parametrizables (se pueden crear plantillas,
como esta).
38
El tipo interface de Java
Para indicar que una clase implementa o satisface una interface se utiliza la palabra
reservada implements
40
Diagrama
41
DEMO
Proyecto: EjemploInterfazJava
42
interfaces y herencia
“múltiple” en Java
• En Java no hay herencia múltiple, pero una interface o una clase
pueden heredar de tantas interfaces como se desee. El resultado
va a ser similar al de la herencia múltiple; se indica que la interfaz
se deriva de otra u otras interfaces empleando la palabra
reservada extends propia de la herencia.
43
interfaces y herencia
“múltiple” en Java
44
Diagrama
45
DEMO
Proyecto: HerenciaMultipleJava
46
interfaces y herencia
“múltiple” en Java
Notas
La clase BaseDatosConArchivos implementa las interfaces
ImportExport y ReadWrite, no hereda de ellas (no son
clases).
La clase BaseDatosConArchivos necesita aportar una
implementación para todos los métodos especificados en las
interfaces ImportExport y ReadWrite. De no se así, se
producirá un error de compilación.
47
Las interfaces como tipos
• No se pueden crear ejemplares de una interfaz, pero se pueden
crear descriptores de ese tipo, puesto que las interfaces son
tipos.
• Los descriptores de tipo interfaz admiten como valor:
• Descriptores de interfaces derivadas.
• Clases que implementen esa interfaz, u otra derivada.
Es posible usar descriptores de un tipo de interfaz para ejecutar
métodos de clases que implementen esa interfaz. Se respeta el
mecanismo de herencia exactamente igual que si fueran
descriptores de clases (a fin de cuentas, son descriptores de clases
que implementan esa interfaz).
48
Las interfaces como tipos
El tipo de la clase cuyo descriptor se almacena en un descriptor de
interfaz determina el método ejecutado, siempre que éste se haya
redefinido en la clase.
51
52
DEMO
Proyecto: InterfacesComoTipos
53
Las interfaces como tipos
Notas
El método lanzarImpresion() se ha construido empleando
como argumento un descriptor de Publicacion, y por tanto
admitirá cualquier clase que implemente esa interfaz. Por tanto, si
en un futuro se crea algún otro tipo de publicación (Periódico
implements Publicacion, pej), sería factible escribir
ict.lanzarImpresion(periodico). Obsérvese que
imprimir es abstracto y puede y debe ser implementado,
adaptándolo a la situación.
También se podría hacer que el argumento de lanzarImpresion
fuera una clase abstracta, fijando así la secuencia de métodos
invocados por imprimir.
54
Las interfaces como tipos
55
Las interfaces como tipos
56
Programación III
Herencia en Java - Curso 2015-2016