Documentos de Académico
Documentos de Profesional
Documentos de Cultura
a Objetos
Semana 8
Logro de la sesión
2
Agenda
• Composición
• Agregación
• Combinación de composición, agregación y herencia
Datos/Observaciones
Composición
Cuerpo Humano
composición no es la mayoría de los jerarquía de
nuevo; eso es lo que productos fabricados composición del
Composición
Composición
Datos/Observaciones
Composición
Una jerarquía de composición parcial para el cuerpo humano:
Datos/Observaciones
Agregación
Las "partes no triviales" del concesionario de automóviles son un grupo de automóviles, un gerente de ventas y
un grupo de vendedores.
Para cada una de las tres relaciones de clase, concesionario-auto, concesionario-vendedor y concesionario-
gerente, ¿es una relación de composición o una relación de agregación?
Datos/Observaciones
Diagrama de clase UML para composición y agregación
Concesionario
La regla general es que siempre que se tiene una clase que contiene a otra clase, es necesario declarar una variable
de instancia dentro de la clase contenedora, de modo que la variable de instancia tenga una referencia a uno o más
de los objetos de la clase contenida.
Típicamente, si se tiene una clase en un diagrama de clase UML con un valor de multiplicidad *, debe usarse una
ArrayList para implementar la referencia a la clase que está con los asteriscos.
Siempre que dos clases tienen una relación de agregación, es necesario guardar el objeto de la clase contenida en
una variable de referencia en la clase contenedora, y también debe guardarlo en otra variable de referencia fuera de
la clase contenedora. De esa forma, el objeto puede añadirse a otra agregación y tener dos “propietarios” distintos
Siempre que dos clases tienen una relación de composición, el objeto en la clase contenida debe guardarse en una
variable de referencia en la clase contenedora, y no debe guardarse en ninguna otra parte. De esa forma, el objeto
sólo puede tener un “propietario”
Datos/Observaciones
Clase Concesionario para la aplicación
/************************************************************
* Concesionario.java
* Representa una organización de ventas de autos minorista.
************************************************************/
import java.util.ArrayList;
public class Concesionario{
private String company;
private Gerente gerente;
private ArrayList<Vendedor> personas = new ArrayList<Vendedor>();
private ArrayList<Auto> autos = new ArrayList<Auto>();
//*********************************************************
public Concesionario(String company, Gerente gerente) {
this.company = company;
this.gerente = gerente; }
//*********************************************************
public void addAuto(Auto auto){
autos.add(auto); Concesionario
}
public void addPersona(Vendedor persona){
personas.add(persona);
}
//*********************************************************
public void printStatus(){
System.out.println(company + "\t" + gerente.getNombre());
for (Vendedor persona : personas) Auto Gerente Vendedor
System.out.println(persona.getNombre());
for (Auto auto : autos)
System.out.println(auto.getMarca());
}// fin de printStatus
} // fin de clase concesionario
Datos/Observaciones
Clase Auto y Gerente de la aplicación
Concesionario
return nombre;
}
} // fin de la clase Vendedor Auto Gerente Vendedor
Datos/Observaciones
Controlador para el programa Concesionario
/*******************************************************
* PruebaConcesionario.java
* Esta clase demuestra la composición de un
* concesionario de automóviles.
*******************************************************/
public class PruebaConcesionario{
public static void main(String[] args){
Gerente ryne = new Gerente("Ryne Mendez");
Vendedor nicole = new Vendedor("Nicole Betz");
Vendedor vince = new Vendedor("Vince Sola");
Concesionario concesionario = new
Concesionario("Automóviles usados que están bien.", ryne);
concesionario.addPersona(nicole);
concesionario.addPersona(vince);
concesionario.addAuto(new Auto("GMC"));
concesionario.addAuto(new Auto("Yugo"));
concesionario.addAuto(new Auto("Dodge"));
concesionario.printStatus();
} // fin metodo main
} // Datos/Observaciones
fin clase main
Comparación de agregación, composición y herencia
Las relaciones de agregación y composición ocurren cuando una clase es un todo integrado por
partes constituyentes no triviales definidas en otras clases.
Una relación de herencia es cuando una clase es una versión más detallada de otra clase. La
clase más detallada es una subclase, y la otra clase es una superclase. La subclase hereda los
miembros de la superclase (variables y métodos).
En el diagrama de clases UML, se puede observar que las clases Vendedor y Gerente definen el mismo
método de instancia, getNombre. Éste es un ejemplo de duplicación indeseable, de modo que para eliminarla
se usa herencia. El hecho de introducir herencia en ese programa no modifica la estructura original todo-
partes. Simplemente introduce un mecanismo complementario que elimina la duplicación..
Datos/Observaciones
Combinación de agregación, composición y herencia
Definamos una clase mas general, la clase Persona, del cual heredaran Gerente y Vendedor y
evitemos ese código duplicado.
/**
* ****************************************************
* Persona.java Ésta es una clase base para una jerarquía de
la herencia.
****************************************************
*/
public class Persona { La clase Persona simplemente almacena un nombre y permite que el
nombre sea recuperado con un método getNombre. La clase Persona
private String nombre = "";
contiene algo que merece la pena examinar: el constructor de
//****************************************************
parámetro cero. Este es útil para probar el programa con un objeto
public Persona() { Persona, y no se desea liar almacenando un nombre en el objeto
}
Persona. ¿Sabe cuál nombre le será dado a un objeto Persona creado
public Persona(String nombre) { por el constructor de parámetro cero? nombre es una variable de
this.nombre = nombre; instancia String, y el valor por defecto de una variable de instancia
}
//**************************************************** String es null. Para evitar el null por defecto, “nombre” se inicializa con
una cadena vacía.
public String getNombre() {
return this.nombre;
}
} // finDatos/Observaciones
clase Persona
Combinación de agregación, composición y herencia
La herencia reduce las clases Gerente y Vendedor a las clases más simples Gerente2 y
Vendedor2. Estas clases no requieren una declaración explícita de nombre ni de getNombre
porque heredan estos miembros de Persona.
/** /**
* ****************************************** * *********************************************
* Gerente2.java Esto representa al gerente del * Vendedor2.java Esto representa un vendedor
concesionario de automóviles. **********************************************
* ****************************************** */
*/ public class Vendedor2 extends Persona {
public class Gerente2 extends Persona {
private double ventas = 0; // ventas a la fecha
public Gerente2(String nombre) { //********************************************
super(nombre);
} public Vendedor2(String nombre) {
} // fin Clase Gerente2 super(nombre);
}
} // fin de Clase Vendedor2
Datos/Observaciones
Combinación de agregación, composición y herencia
Datos/Observaciones
Resumen
• Los lenguajes orientados a objetos ayudan a organizar las cosas y los conceptos en dos tipos
básicos de jerarquías: una jerarquía tiene-un para componentes en una agregación o en una
composición, y una jerarquía es-un para tipos en una herencia.
• Una jerarquía de agregación o composición existe cuando un objeto grande contiene varios
objetos más pequeños (componentes).
• Para una relación de clase todo-partes, si el contenedor contiene la única referencia a un
componente, entonces el componente asociación es la composición. En caso contrario, se
trata de agregación.
• Los programadores utilizan a menudo combinaciones de agregación, composición y herencia
para tratar diferentes aspectos de un problema de programación global. En un diagrama de
clase UML, ambas relaciones se representan mediante líneas continuas entre clases
relacionadas, y estas líneas se denominan asociaciones. En una asociación de
composición/agregación hay un diamante lleno/ hueco en el extremo del contenedor de cada
línea de asociación. En una asociación jerárquica hay una punta de flecha hueca en el
extremo de la superclase de la línea de asociación.
Resumen
• Cuando se tiene una asociación complicada entre objetos, puede ser de utilidad reunir
referencias a esos objetos en una clase de asociación común.