Sunteți pe pagina 1din 6

UNIVERSIDAD DE JAN

Departamento de Informtica Prctica 4. Relaciones entre clases (II)

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.

La derivacin de una subclase se realiza fcilmente de la siguiente forma:

/* ---
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)

// A continuacin especializamos la superclase para


// identificar un tipo especfico de componentes
// Definicin de la subclase
Public class Microprocesador extends ComponenteOrdenador {
private int nucleos;
public Microprocesador(){
super();
nucleos=1;
}
public Microprocesador(float precio, int nucleos){
super(precio);
this.nucleos = nucleos;
};
}

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.

Es especialmente interesante el hecho de saber que todo objeto de la Subclase es tambin un


objeto de la Superclase. Entendamos lo que esto significa: cada vez que instanciamos un
objeto Microprocesador se llama a su constructor, pero tambin se deber hacer una llamada
al constructor de la superclase, es decir, de 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;
}

Por supuesto, si en el constructor de la subclase no se llama a ninguno de los constructores de


la superclase, se ejecutar el constructor por defecto de esta ltima. No obstante, se aconseja
llamarlo expresamente por motivos de claridad en el cdigo.
Pgina 3 de 6
UNIVERSIDAD DE JAN
Departamento de Informtica Prctica 4. Relaciones entre clases (II)

Constructor de copia en clases derivadas


El constructor de copia es el encargado de construir una copia de un objeto a partir de otro de
la misma clase. Su funcionamiento consiste en realizar la copia de cada uno de los atributos del
objeto original en el nuevo objeto copiado. En el caso de clases derivadas, es necesario
redefinir el constructor de copia heredado de la superclase siempre y cuando se aadan
nuevos atributos a la superclase que tambin deban ser copiados. En este caso, al igual que
ocurre con los constructores de clases derivadas, debemos hacer uso de la implementacin del
constructor de copia de la superclase y posteriormente realizar la copia de los nuevos atributos
de la subclase. Al igual que ocurre con el resto de constructores, la llamada a otros
constructores se realiza al principio.

/* ---
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;
}
}

public class Triangulo extends Poligono {


private float altura;
public Triangulo(){
super(3);
altura = 1;
}
public Triangulo (Triangulo orig){
super(orig); //constructor de copia de la clase Poligono
altura = orig.altura; //constructor de copia del atributo altura
};
}

Ejemplos de utilizacin del constructor de copia en la clase derivada:

Triangulo tri1 = new Triangulo();


Triangulo tri2 = new Triangulo(tri1);

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:

o tambin de forma equivalente, aunque haciendo nfasis en el detalle de implementacin

1. Defina e implemente la clase Cliente con los siguientes atributos y mtodos:


a. Atributo direccionPostal de tipo cadena
b. Constructores parametrizados y de copia.
c. Mtodos get/set

2. Defina e implemente la clase Empleado con los siguientes atributos y mtodos:


a. Atributo salario (>600)
b. Constructores parametrizados y copia.
c. Mtodos get/set

Pgina 5 de 6
UNIVERSIDAD DE JAN
Departamento de Informtica Prctica 4. Relaciones entre clases (II)

3. Defina e implemente la clase Concepto con los siguientes atributos y mtodos:


a. Atributo producto.
b. Atributos cantidad (>=1) y descuento (>=0 y <=80%)
c. nico constructor que admita el producto, la cantidad y el descuento. La clase
no debe permitir crear objetos con un constructor por defecto (sin
parmetros)
d. Constructor de copia.
e. Mtodos get/set
f. Mtodo getCoste() que devuelve el precio total del concepto en funcin de la
cantidad de unidades del producto que tiene asociado y el descuento que se le
aplique.

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

5. Implementar el constructor de copia. NO se copiarn en ningn caso los IDs de


Persona.

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

S-ar putea să vă placă și