2009-04-17 13 views

Respuesta

20

Esa es una pregunta bastante abstracto, dado que tanto la composición & agregación son bastante similares & realmente sólo diferente conceptualmente y no necesariamente en el nivel de código. (es decir, puede considerar que un automóvil tiene un motor para su composición y un perro que tiene pulgas para ser agregado, pero no hay nada que lo impida al implementarlos de la misma manera si los estuviera modelando en código).

Sin embargo, si quieres romper las diferencias & & intentar añadir la fuerza las decisiones de diseño de software para resaltar esas diferencias Creo que se puede hacer algo como esto ... tomar an example from Wikipedia:

agregación difiere de lo ordinario composición en el sentido de que no implica propiedad. En la composición, cuando se destruye el objeto propietario, también lo son los objetos contenidos. En 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 podría trabajar en más de un departamento, pero un departamento no podría formar parte de más de una universidad.

Es posible construir este código para representarla (con el mayor número de indicaciones artificiales de composición/agregación):

public class University : IDisposable 
{ 
    private IList<Department> departments = new List<Department>(); 

    public void AddDepartment(string name) 
    { 
     //Since the university is in charge of the lifecycle of the 
     //departments, it creates them (composition) 
     departments.Add(new Department(this, name)); 
    } 

    public void Dispose() 
    { 
     //destroy the university... 
     //destroy the departments too... (composition) 
     foreach (var department in departments) 
     { 
      department.Dispose(); 
     } 
    } 
} 

public class Department : IDisposable 
{ 
    //Department makes no sense if it isn't connected to exactly one 
    //University (composition) 
    private University uni; 
    private string name; 

    //list of Professors can be added to, meaning that one professor could 
    //be a member of many departments (aggregation) 
    public IList<Professor> Professors { get; set; } 

    // internal constructor since a Department makes no sense on its own, 
    //we should try to limit how it can be created (composition) 
    internal Department(University uni, string name) 
    { 
     this.uni = uni; 
     this.name = name; 
    } 

    public void Dispose() 
    { 
     //destroy the department, but let the Professors worry about 
     //themselves (aggregation) 
    } 
} 

public class Professor 
{ 
} 
+3

vieja pregunta, pero me encontré con que, os recomiendo que si el Departamento está siendo solo compuesto, puede hacer que eso sea una clase anidada dentro de la universidad y hacerlo privado. De este modo, es imposible para cualquier otro lugar declarar un Departamento y dejar explícita la relación padre/hijo. –

5

Bueno, en un mundo basura recogida donde se accede a todos los objetos a través de referencias, la sutil diferencia (en propiedad) entre la composición estricta y agregación difumina un poco - por lo que en general (cuando se utiliza clases) que se reduce a un campo de otro objeto o colección:

class Building { 
    private readonly List<Room> rooms = new List<Room>(); 
    public IList<Room> Rooms {get {return rooms;}} 

    public Address Address {get;set;} 
    //... 
} 
class Address { 
    public string Line1 {get;set;} 
    public string PostCode {get;set;} 
    //... 
} 
class Room { 
    public string Name {get;set;} 
    public int Capacity {get;set;} 
    //... 
} 

Si me he perdido el punto, por favor aclarar ...

Las cosas están más involucrados cuando se discute struct s - pero por lo general cuando se habla de conceptos OO, struct uso está limitado a los campos de valor ...

Cuestiones relacionadas