2010-08-09 13 views

Respuesta

49

Composición se refiere a la combinación de tipos simples para hacer más complejos. En su ejemplo, la composición puede ser:

Animal: 
    Skin animalSkin 
    Organs animalOrgans 


Mammal::Animal: 
    Hair/fur mammalFur 
    warm-blooded-based_cirulation_system heartAndStuff 

Person::Mammal: 
    string firstName 
    string lastName 

Si quería ir totalmente composición (y deshacerse de toda la herencia) se vería así:

Animal: 
    Skin animalSkin 
    Organs animalOrgans 

Mammal: 
    private Animal _animalRef 
    Hair/fur mammalFur 
    warm-blooded-based_cirulation_system heartAndStuff 

Person: 
    private Mammal _mammalRef 
    string firstName 
    string lastName 

La ventaja de este enfoque es que los tipos Mammal y Person no tienen que ajustarse a la interfaz de su padre anterior. Esto podría ser una buena cosa porque a veces un cambio a la superclase puede tener efectos graves en las subclases. Aún pueden tener acceso a las propiedades y el comportamiento de estas clases a través de sus instancias privadas de estas clases, y si quieren exponer estos comportamientos de superclase anteriores, simplemente pueden envolverlos en un método público.

me encontré con un buen enlace con buenos ejemplos aquí: http://www.artima.com/designtechniques/compoinh.html

+4

Entonces, ¿puedo decir que: "La composición es cuando creo un objeto de 'Clase A' dentro de 'Clase B' (en lugar de subclasificar 'Clase B' de 'Clase A')". ? – thesummersign

+0

oh. ok lo entendí 'w69rdy' respondió más tarde. SÍ, puedo decir eso. – thesummersign

31

La composición es simplemente las partes que componen el conjunto. Un automóvil tiene ruedas, un motor y asientos. La herencia es una relación "es una". La composición es una relación "tiene una".

+2

Y la agregación es una ... relación. –

+1

La agregación puede ser una composición simple, o si se trata de una colección de elementos similares (por ejemplo, ruedas en un automóvil), se puede tratar como una colección.Un automóvil puede tener cuatro ruedas individuales, identificadas de forma única, o puede tener una colección de ruedas. Depende del uso Si usa una clase de colección, entonces la colección es en sí misma una agregación. –

2

Un ejemplo de composición es donde se tiene una instancia de una clase dentro de otra clase, en lugar de heredar de ella

página

This tiene un buen artículo que explica por qué la gente dice "composición favor sobre la herencia" con algunos ejemplos de por qué.

+1

No realmente * una instancia de una clase [C2] dentro de otra clase [C1] * pero * una ** instancia ** de una clase dentro de ** instancia ** de otra clase *. El primero podría malinterpretarse como si creara una instancia de C2 al definir C1, que no debería ser común. –

14

Hay tres maneras de dar un comportamiento a una clase. Puedes escribir ese comportamiento en la clase; puedes heredar de una clase que tenga el comportamiento deseado; o puede incorporar una clase con el comportamiento deseado en su clase como campo o variable miembro. Las dos últimas representan formas de reutilización de código, y la última - composición - es generalmente preferida. En realidad, no le da a su clase el comportamiento deseado, aún necesita llamar al método en el campo, pero impone menos restricciones en el diseño de su clase y los resultados son más fáciles de probar y más fáciles de depurar. La herencia tiene su lugar, pero se debe preferir la composición.

+1

+1: La composición es el rey. –

11
class Engine 
{ 

} 

class Automobile 
{ 

} 


class Car extends Automobile // car "is a" automobile //inheritance here 
{ 
Engine engine; // car "has a" engine //composition here 

} 

Composición - Funcionalidad de un objeto se compone de un agregado de diferentes clases. En la práctica, esto significa mantener un puntero a otra clase a la que se pospone el trabajo.

Herencia - La funcionalidad de un objeto se compone de su propia funcionalidad más funcionalidad de sus clases principales.

En cuanto a por qué la composición es preferible a la herencia, eche un vistazo al Circle-ellipse problem.

Cuestiones relacionadas