Entiendo qué es la composición en OOP, pero no puedo tener una idea clara de lo que es la Agregación. ¿Alguien puede explicar?
Entiendo qué es la composición en OOP, pero no puedo tener una idea clara de lo que es la Agregación. ¿Alguien puede explicar?
Reglas simples:
Ejemplo 1:
Una empresa es una agregación de personas. Una empresa es una composición de cuentas. Cuando una empresa deja de hacer negocios, sus cuentas dejan de existir pero su gente sigue existiendo.
Ejemplo 2: (muy simplificado)
Un editor de texto posee un búfer (composición). Un editor de texto utiliza un archivo (agregación). Cuando se cierra el editor de texto, el búfer se destruye pero el archivo en sí no se destruye.
De enlace
La agregación se diferencia de la composición ordinaria en que no implica propiedad. En composición, cuando el objeto propietario se destruye, también lo son los objetos contenidos. En la agregación, esto no es necesariamente cierto. Por ejemplo, una universidad posee varios departamentos (por ejemplo, química), y cada departamento tiene varios profesores. Si la universidad cierra, los departamentos ya no existirán, pero los profesores en esos departamentos continuarán existiendo. Por lo tanto, una universidad puede verse como una composición de departamentos, mientras que los departamentos tienen una agregación de profesores. Además, un profesor puede trabajar en más de un departamento, pero un departamento no puede formar parte de más de una universidad.
Entonces, si bien tiene una relación de propiedad con la composición, el objeto de propiedad también se destruye cuando el propietario lo es, una agregación (y los objetos contenidos) pueden existir independientemente.
-
Actualizar: Disculpas: esta respuesta es demasiado simplista en retrospectiva.
c.batt proporciona una excelente definición en su respuesta: Agregación vs Composición
No hay una explicación única. Diferentes autores significan diferentes cosas por agregación. La mayoría realmente no significa nada específico por ello.
La composición es una asociación
La agregación es una asociación
La composición es una asociación strong (si la vida del objeto contenido depende totalmente del objeto contenedor, se denomina asociación fuerte)
La agregación es una asociación débil (si la vida del objeto contenido no depende del objeto contenedor, se llama asociación débil)
Ejemplo:
class Contained {
public void disp() {
System.out.println("disp() of Contained A");
}
}
public class Container {
private Contained c;
//Composition
Container() {
c = new Contained();
}
//Association
public Contained getC() {
return c;
}
public void setC(Contained c) {
this.c = c;
}
public static void main(String[] args) {
Container container = new Container();
Contained contained = new Contained();
container.setC(contained);
}
}
Composición (mezcla) es una forma de combinar objetos simples o tipos de datos en objetos más complejos. Las composiciones son un bloque de construcción crítico de muchas estructuras de datos básicas
Agregación (colección) difiere de la composición ordinaria en que no implica propiedad. En composición, cuando el objeto propietario se destruye, también lo son los objetos contenidos. En conjunto, esto no es necesariamente cierto
╔═══════════╦═════════════════════════╦═══════════════════════╗
║ ║ Aggregation ║ Composition ║
╠═══════════╬═════════════════════════╬═══════════════════════╣
║ Life time ║ Have their own lifetime ║ Owner's life time ║
║ Relation ║ Has ║ part-of ║
║ Example ║ Car has driver ║ Engine is part of Car ║
╚═══════════╩═════════════════════════╩═══════════════════════╝
Ambos denotan relación entre el objeto y solo difieren en su fuerza.
NotacionesUMLparadiferentestiposdedependenciaentredosclases
Composición:comoEngineespartedeCar,larelaciónentreellosesComposición.AquíescómoseimplementanentrelasclasesdeJava.
publicclassCar{//finalwillmakesureengineisinitializedprivatefinalEngineengine;publicCar(){engine=newEngine();}}classEngine{privateStringtype;}
Agregación:comolaOrganizacióntienePersonacomoempleados,larelaciónentreelloseslaAgregación.AquíescómosevenentérminosdeclasesdeJava
publicclassOrganization{privateListemployees;}publicclassPerson{privateStringname;}
la agregación es una colección simple, como una bolsa de canicas
la composición implica dependencias internas / funcionales, como las bisagras de una caja
coches agregados pasajeros; entran y salen sin romper la funcionalidad del auto
los neumáticos son componentes; retira uno y el auto ya no funciona correctamente
[nota: el neumático de repuesto es un agregado!]
Siempre veo la composición como 'necesita un', es decir, un coche necesita un motor , y veo la agregación como 'cosas relacionadas con un propósito'. Por lo tanto, manteniéndome en la analogía del automóvil, mi agregación puede ser representar un viaje que puede implicar reunir un automóvil y pasajeros juntos. El viaje no es propietario del automóvil ni de los pasajeros, estoy agregando datos relacionados con un escenario específico. Cuando el viaje se completa, el coche y los pasajeros continúan. Cuando se termina un automóvil, el automóvil y su motor normalmente se destruyen juntos.
Semánticamente, todos los conjuntos están hechos de subconjuntos, ¿verdad? Por lo tanto:
La agregación es cuando esos subconjuntos existen independientemente del conjunto padre. Como un monitor puede desconectarse de la computadora para conectarse a otro.
La composición es cuando esos subconjuntos dependen de la existencia del conjunto padre. Como una hoja es una parte de un árbol o el hígado es una parte de un cuerpo.
Estos conceptos se refieren al tipo de dependencia entre dos objetos o clases, conceptualmente. Directamente en un programa, en una agregación, cuando el objeto padre se desecha, los objetos agregados también deben eliminarse. En el mismo escenario para una composición, los objetos hijo compuestos persistirán y el objeto padre se dispensa.
¿Qué te parece este sencillo ejemplo?
Una matriz de objetos es una composición. Una matriz de punteros a objetos es una agregación.
Si elimino el primero, su contenido desaparecerá con él. El segundo, por otro lado, puede desaparecer sin afectar la existencia de sus miembros, a menos que exista un método específico que elimine cada objeto a medida que se elimina su puntero.
Lea otras preguntas en las etiquetas object-oriented