Fundamentos de
Programación 2
Ing. Marco Aedo López
Programación Orientada a Objetos –
Agregación, Composición y Herencia
Capítulo 5
Objetivos
Comprender como las cosas son organizadas
naturalmente con la agregación y composición
Implementar las relaciones de agregación y
composición en un programa
Comprender como usar la herencia para refinar
una clase ya creada
Implementar la herencia en un programa
Aprender a construir constructores para las
clases derivadas y cómo sobreescribir un método
heredado
Solucionar problemas aplicando los conceptos de
OO
CONTENIDOS:
Composición
Agregación
Diagrama de clases de UML para composición y agregación
Herencia
Diagrama de clases de UML para la herencia
Beneficios de la herencia
Herencia para las variables de instancia privadas de
una superclase
Usando super para llamar a constructores de la
superclase
Llamando a un método de superclase desde dentro de
una subclase
Llamada por default al constructor de una superclase
Sobreescritura de método
El modificador de acceso final
Comparación y combinación de los 3 mecanismos vistos
Introducción
En el main()
1
student st
Student student = new Student();
student.setName(“Jon Java”);
student.setEmail(“
[email protected]”);
card2
LibraryCard card2;
card2 = new LibraryCard();
card2.setOwner(student);
1 2
public class LibraryCard{
private Student owner; : LibraryCard : Student
public void setOwner(Student st){
owner = st;
owner name
} 2
} “Jon Java”
Dentro de la clase del objeto llamado borrowCnt email
0 “
[email protected]”
1 Argumento es pasado
2 Valor del parámetro es asignado Estado de la Memoria
al dato miembro
Introducción
Pasamos el mismo objeto
student a card1 y card2
Debido a que estamos
pasando una referencia al
mismo objeto, esto resulta
en que el atributo owner de
los dos objetos LibraryCard
estarán apuntando al
mismo objeto Student
Introducción
• Hasta el momento sólo vimos la relación de
Dependencia entre clases:
OtraClase
ClasePrincipal
1. Composición
Anteriormente, todos nuestros objetos han sido
relativamente simples, así pudimos describir cada
objeto con una sola clase individual
Para objetos más complejos, deberíamos considerar
dividir el objeto en sus partes y definir una clase como
el todo y otras clases como las partes del todo
Cuando la clase TODO está compuesta de las clases
PARTE, la organización de clases se llama
agregación
Cuando la clase TODO es la propietaria exclusiva de
las clases PARTE, la organización de clases se llama
composición
Ambas se llaman relación “TIENE” o “TIENE-UN”
1. Composición
El concepto de composición no es nuevo, es lo que
hacemos con los objetos complejos del mundo real:
Cada ser viviente y casi todo producto está hecho de partes
Muchas veces, cada parte a su vez está hecha de su propio
conjunto de subpartes
Con una relación de composición, una parte está
limitada a tener un sólo propietario a la vez
Ejemplo: un corazón puede estar en sólo un cuerpo a
la vez
Ejemplo: un motor puede estar en sólo un vehículo a
la vez
1. Composición
Todo
Parte
1. Composición
El cuerpo humano (jerarquía de composición)
2. Agregación
En la composición, la relación entre el todo y la parte
se conoce como relación: “TIENE-UN”
Ejemplo: cada cuerpo humano tiene un cerebro y tiene un
corazón
Hay otra relación tiene-un, llamada agregación, la cual
es más débil que la composición
Con la agregación una clase es el todo y otras clases
son partes del todo (como con la composición), pero
no hay la restricción adicional que requiere que las
partes sean exclusivas del todo
2. Agregación
Ejemplos donde las partes no son exclusivas del todo:
Podemos implementar una Escuela Profesional como una
agregación, creando la clase todo para la Escuela y las clases
parte para los diferentes tipos de personas que trabajan y
estudian en la Escuela
Las personas no son propiedad exclusiva de la Escuela,
porque una persona puede ser parte de más de una
agregación
Una persona puede asistir a 2 Escuelas diferentes y ser parte
de 2 agregaciones
2. Agregación
Todo
Parte
3. Ejemplo
Tratamos de modelar un Concesionario de Autos
El Concesionario tiene un grupo de autos, un gerente
de ventas y un grupo de vendedores
¿Qué clases necesitamos?
Auto, Gerente, Vendedor, Concesionario
El Concesionario contiene a las otras 3 clases
Existen relaciones del Concesionario con las otras
3 clases, ¿qué tipo de relación son?
3. Ejemplo
Concesionario
*
1 *
* 1 *
Auto Gerente Vendedor
Línea sólida entre 2 clases es una asociación (relación
más simple) y línea discontinua es relación de uso o
dependencia
Línea sólida con rombo lleno es una composición
Línea sólida con rombo vacío es una agregación
El rombo va en el lado del todo
Los números y signos en la línea son los valores de
multiplicidad (indica el número de instancias para cada
una de las clases conectadas)
* representa “muchos”
3. Ejemplo
Para implementar un programa usando agregación y
composición:
Definir una clase para el TODO y otras clases para cada
PARTE
Para una clase contenedora, declarar una variable de
instancia tal que almacene la referencia de uno o más de los
objetos contenidos
Típicamente la multiplicidad * (en la clase PARTE) usa un
ArrayList para implementar los varios objetos
3. Ejemplo
Para implementar un programa usando agregación y
composición:
Si dos clases tienen la relación de agregación, almacenar el
objeto de la clase contenida por medio de una variable de
referencia en la clase contenedora
Pero además almacenarla en otra variable de referencia
fuera de la clase contenedora, así dicho objeto puede ser
añadido a otra agregación y puede tener 2 ó más
propietarios
Si dos clases tienen una relación de composición, almacenar
el objeto de la clase contenida en una variable de referencia
en la clase contenedora, pero no almacenarla en otro lugar.
Así tendrá 1 sólo propietario
3. Ejemplo
UML y programa. Crear un concesionario con su
gerente, 2 vendedores y 3 autos. Queremos imprimir
el estatus del concesionario: nombre de la empresa,
del gerente, los datos de los vendedores y de los
autos. El programa debe permitir añadir vendedores y
autos al concesionario
Cada auto sólo pertenece a un concesionario, pero un
gerente o vendedor puede pertenecer a varios
Por lo pronto usar sólo: Concesionario
Auto: marca *
Gerente: nombre 1 *
Vendedor: nombre, ventas * 1 *
Auto Gerente Vendedor
3. Ejemplo
3. Ejemplo
9
/*************************************************************
* Dealership.java
* Dean & Dean
*
* This represents an auto retail sales organization.
*************************************************************/
import java.util.ArrayList;
public class Dealership
{
private String company;
private Manager manager;
private ArrayList<SalesPerson> people = new ArrayList<SalesPerson>();
private ArrayList<Car> cars = new ArrayList<Car>();
//**********************************************************
public Dealership(String company, Manager manager)
{
this.company = company;
this.manager = manager;
}
3. Ejemplo
Ejercicios:
Mejorar el ejemplo anterior aumentando atributos y
métodos a cada clase parte y variando el main para
que los utilice
Ejemplo Agregación
Ejemplo Agregación
Ejemplo Agregación
¿Puedo volver una relación de Agregación en Composición?
StudenClass obj = new StudentClass(123,"Chaitanya,
new Address(55,"Agra","UP","India"))
¿Cuál es la mejor?
StudentClass StudentClass
Address Address
Ejercicios:
EMPLEADO:
Atributos: nombre, apellido, direccion, fechaNacimiento,
fechaIngresoEmpresa
Métodos:
2 constructores sobrecargados Empleado() y Empleado (nom, ape, dir,
nAño, nMes, nDia, iAño, iMes, iDia)
mostrar(): muestra una cadena con el formato: "apellido, nombre vive en
direccion, nacio el fechaNacimiento e ingresó a la empresa el
fechaIngresoEmpresa"
FECHA:
Atributos: año, mes, dia
Métodos:
4 constructores sobrecargados Fecha(), Fecha(a), Fecha(a,m), Fecha(a,m,d)
set y get para cada atributo, verificando validez
setFechaIngreso donde se pueda cambiar los valores de ingreso de la fecha
bisiesto para ver si es o no bisiesto (boolean)
3 métodos para mostrar:
1996/8/14
14 de agosto de 1996
Cantidad de días que han transcurrido del año