Documente Academic
Documente Profesional
Documente Cultură
CONTENIDO
Objetivos ....................................................................................................................................... 2
Contenidos .................................................................................................................................... 2
Relacin de generalizacin especializacin............................................................................... 2
Constructor de copia en clases derivadas ................................................................................. 4
Ejercicios........................................................................................................................................ 5
Pgina 1 de 6
UNIVERSIDAD DE JAN
Departamento de Informtica Prctica 4. Relaciones entre clases (II)
OBJETIVOS
Saber realizar generalizaciones-especializaciones de clases utilizando herencia
Conocer las peculiaridades y saber implementar el constructor de copia en clases
derivadas cuando existen relaciones de herencia en el diseo
CONTENIDOS
Relacin de generalizacin especializacin
Una de las relaciones ms caractersticas dentro de la POO es la de generalizacin-
especializacin, que se traduce a la hora de programar en la utilizacin de herencia para
derivar nuevas subclases a partir de una superclase.
Dado que el concepto de herencia lleva asociado otro conjunto de conceptos ms complejos,
haremos en esta prctica una primera aproximacin que consistir exclusivamente en la
derivacin de nuevas subclases.
Cuando hablamos de especializacin de una clase nos referimos al hecho de que, a la hora de
plantear nuestro diseo, por algn motivo en particular, observamos que existen objetos de la
clase que tienen caractersticas y/o comportamientos especficos adems de las caractersticas
y comportamiento de la clase a la que pertenecen. En esta situacin, podemos utilizar la
relacin de herencia para derivar una clase especializada que aada estado y/o
comportamiento al de la clase padre. De esta forma, reutilizamos el cdigo de esa clase padre
y aadimos nuevos atributos o mtodos que complementen o sobrecarguen el
comportamiento de los objetos de la nueva clase hija.
/* ---
Ejemplo de derivacin de clases
--- */
// Definicin de la superclase
public class ComponenteOrdenador {
private float precio;
public ComponenteOrdenador() {
precio = 0;
};
Public ComponenteOrdenador(float precio ){
this.precio = precio;
}
}
Pgina 2 de 6
UNIVERSIDAD DE JAN
Departamento de Informtica Prctica 4. Relaciones entre clases (II)
Hay que recordar que la clase derivada nicamente tendr acceso a los atributos y mtodos
pblicos o protegidos de la superclase, pero no tendr acceso a los privados. Existen varios
motivos por los que se hace necesario que las clases hijas no accedan a los mtodos y atributo
privados: evitar que la subclase tenga dependencias con detalles de implementacin que
puedan variar en la superclase, simplificar la interfaz de uso de la superclase, garantizar que la
subclase no altera la integridad de la informacin que gestiona la superclase, etc.
As, en el ejemplo anterior, ningn objeto de tipo Microprocesador podra acceder (ni para
consultar ni para modificar) directamente al atributo definido como precio, sino que debera
hacerlo a travs de los mtodos GET y SET que podramos incorporar como mtodos pblicos
de la superclase ComponenteOrdenador.
El siguiente cdigo indica cmo es posible hacer una llamada a un constructor especfico de la
superclase cuando esta tiene los constructores sobrecargados.
/* ---
Ejemplo de llamada a constructor de la superclase desde constructor de la
subclase
--- */
public Microprocesador( float precio, const int nucleos):
super( precio );
this.nucleos = nucleos;
}
/* ---
Ejemplo de llamada al constructor de copia de la superclase Poligono
desde el constructor de copia de la subclase Triangulo
--- */
public class Poligono {
private int numLados;
public Poligono(){
numLados = 1;
};
public Poligono(int numLados){
this.numLados = numLados;
};
public Poligono (Poligono orig){
numLados = orig.numLados;
}
}
Pgina 4 de 6
UNIVERSIDAD DE JAN
Departamento de Informtica Prctica 4. Relaciones entre clases (II)
EJERCICIOS
Durante el diseo de la aplicacin de gestin de pedidos, se determina que en el sistema debe
diferenciarse entre clientes y empleados que atienden los pedidos (hasta ahora, ambos eran
simplemente Persona). Para tal fin, realizar una especializacin de la clase Persona en dos
subclases Cliente y Empleado. Ambas clases heredarn las caractersticas bsicas de una
Persona (nombre, apellidos, etc.) e implementarn cada uno las funcionalidades especficas
que les correspondan.
Tambin se observa que es posible que en un pedido se incluyan varios productos del mismo
tipo, en cuyo caso podra existir un descuento adicional sobre el precio de dichos productos.
Por tal motivo, se determina implementar una clase asociacin que permita aadir esta
informacin a la relacin entre Pedido y Producto tal y como se indica en la figura:
Pgina 5 de 6
UNIVERSIDAD DE JAN
Departamento de Informtica Prctica 4. Relaciones entre clases (II)
4. Adaptar (lo cual normalmente en POO se denomina Refactorizar) la clase Pedido para
reflejar los cambios anteriores:
a. Debe hacer referencia respectivamente al Cliente que hace el pedido y al
empleado que lo est gestionando
b. Gestionar un vector de Conceptos en vez de a productos. No obstante, la
clase Concepto debe permanecer oculta a los usuarios de la clase Pedido. Es
decir, si se aade un producto a un pedido, la clase pedido se encargar de
crear el Concepto correspondiente de forma transparente y aadirle el
producto seleccionado. De igual forma, si se solicita un producto de un Pedido,
deber devolverse el producto y no el concepto que lo contiene
6. Modificar el programa principal para poder probar todos los cambios realizados. (Nota:
es posible que deba crear/adaptar mtodos en las clases existentes para permitir
algunas de las opciones solicitadas. Estudie las funcionalidades de cada clase y sus
relaciones con el resto para definir la interfaz de comunicacin adecuada para cada
clase):
a. Crear e inicializar dos vectores de Clientes y Empleados respectivamente.
b. Crear 3 Clientes y 3 empleados y aadirlos a cada uno de sus correspondientes
vectores.
c. Para cada cliente crear al menos un pedido con 2 o 3 artculos. Deben incluirse
varias unidades de cada artculo en el pedido. Asociarle tambin algn
empleado a cada pedido.
d. Implementar una funcin de clase (es decir, un mtodo static) en la clase
Pedido, float getFacturacionCliente(Pedido [] pedidos, int idCliente) , que dado
un vector de pedidos y el id de un cliente, devuelva el total facturado por ese
cliente (coste total de todos los pedidos que tiene).
e. Crear una copia de alguno de los clientes ya existentes usando el constructor
de copia pasndole el cliente original.
Pgina 6 de 6