2010-08-09 20 views

risposta

49

La composizione si riferisce alla combinazione di tipi semplici per rendere più complessi. Nel tuo esempio, la composizione potrebbe essere:

Animal: 
    Skin animalSkin 
    Organs animalOrgans 


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

Person::Mammal: 
    string firstName 
    string lastName 

Se si voleva andare totalmente la composizione (e di sbarazzarsi di tutto eredità) sarebbe simile a questa:

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 

Il vantaggio di questo approccio è che i tipi Mammal e Person non devono essere conformi all'interfaccia del precedente genitore. Questo potrebbe essere essere una buona cosa perché a volte una modifica alla superclasse può avere seri effetti sulle sottoclassi. Possono ancora accedere alle proprietà e ai comportamenti di queste classi attraverso le loro istanze private di queste classi e, se desiderano esporre questi comportamenti di superclasse precedente, possono semplicemente racchiuderli in un metodo pubblico.

ho trovato un buon legame con i buoni esempi qui: http://www.artima.com/designtechniques/compoinh.html

+4

Quindi posso dire che: "La composizione è quando creo un oggetto di" Classe A "all'interno di" Classe B "(invece di sottoclassi di" Classe B "da" Classe A'). " ? – thesummersign

+0

oh. ok capito 'w69rdy' ha risposto in seguito. Sì, posso dirlo. – thesummersign

31

La composizione è semplicemente le parti che costituiscono il tutto. Una macchina ha ruote, un motore e posti a sedere. L'ereditarietà è una relazione "è una". La composizione è una relazione "ha una".

+2

E Aggregazione è una ... relazione. –

+1

L'aggregazione può essere una composizione semplice oppure, se si tratta di una raccolta di cose simili (ad esempio, ruote su un'automobile), può essere considerata come una raccolta.Una macchina può avere quattro ruote singole, identificate in modo univoco, oppure può avere una collezione di ruote. Dipende dall'uso. Se si utilizza una classe di raccolta, la raccolta è di per sé un'aggregazione. –

2

Un esempio di composizione è dove si dispone di un'istanza di una classe all'interno di un'altra classe, invece di ereditare da essa

This pagina ha un buon articolo che spiega il motivo per cui la gente dice "composizione favore per l'eredità" con alcuni esempi di perché.

+1

Non proprio * un'istanza di una classe [C2] all'interno di un'altra classe [C1] * ma * un'istanza ** ** di una classe all'interno di ** istanza ** di un'altra classe *. Il primo potrebbe essere frainteso come se istanziate C2 quando si definisce C1, che non dovrebbe essere comune. –

14

Ci sono tre modi per dare un comportamento a una classe. Puoi scrivere quel comportamento nella classe; puoi ereditare da una classe che ha il comportamento desiderato; oppure puoi incorporare una classe con il comportamento desiderato nella tua classe come campo o variabile membro. Gli ultimi due rappresentano forme di riuso del codice, e quella finale - composizione - è generalmente preferita. In realtà, non offre alla tua classe il comportamento desiderato - devi ancora chiamare il metodo sul campo - ma pone meno vincoli sulla progettazione della tua classe e risulta più semplice da testare e più facile da eseguire il debug del codice. L'ereditarietà ha il suo posto, ma la composizione dovrebbe essere preferita.

+1

+1: la composizione è re. –

11
class Engine 
{ 

} 

class Automobile 
{ 

} 


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

} 

Composizione - Funzionalità di un oggetto è costituito da un aggregato di classi diverse. In pratica, questo significa tenere un puntatore a un'altra classe a cui il lavoro viene differito.

Ereditarietà - Le funzionalità di un oggetto sono costituite dalla sua funzionalità e dalle sue funzionalità principali.

Per quanto riguarda il motivo per cui la composizione è preferita rispetto all'ereditarietà, dai un'occhiata allo Circle-ellipse problem.

Problemi correlati