L'esempio seguente è uno di Composizione?

1

Sto cercando di decidere il tipo di relazione (o associazione) che esiste tra le seguenti due classi:

Class Stable
{
private const int MaxStableRooms;
private Horses[] Horses;

public Stable(int MaxStableRooms)
{
Horses = new Horse[MaxStableRooms];
for  (int i = 0; i < horsecount; i++)
  Horses[i]  = new Horse();
}

}

Class Horse:Animal
{
 ...
}

(spero di aver fornito dettagli sufficienti nell'esempio sopra)

Ho la sensazione che sia Composizione. Se la Scuderia viene distrutta, anche i cavalli.

È corretto?

    
posta user3396486 27.09.2016 - 16:40
fonte

3 risposte

2

Per aggiungere a @ la buona risposta di RobertHarvey e l'eccellente osservazione di @ tofro nel commento:

If the Stable is destroyed, so the horses too.

Questo snippet non è realistico in diversi modi:

Solo perché l'array Horses viene mostrato come assegnato una volta, contrassegnato come privato, e l'esempio è altrimenti incompleto possiamo immaginare che forse i Cavalli vengano persi da distruggere il Stable . Tuttavia, ad esempio, tutto ciò che sarebbe necessario per non perdere i cavalli è che vengano esposti al di fuori della classe Stable e catturati; è plausibile che un'altra classe cataloghi tutti i cavalli, per esempio.

È strano che lo Stable crei nuovi cavalli nel suo costruttore, ma solo perché lo fa non significa necessariamente che li distrugge alla sua distruzione.

Che crei nuovi cavalli significa che la creazione di una nuova stalla rappresenta immediatamente una stalla completamente popolata, non necessariamente in grado di contenere cavalli esistenti. Dove posso mettere un cavallo esistente? Non in una tale stalla, sono sempre pieni di cavalli nuovi di zecca.

Più realistico sarebbe:

Che lo Stabile è preconfigurato (cioè creato) con un numero fisso di bancarelle, ognuna delle quali può essere dinamicamente vuota o assegnata a un cavallo.

E che nel tempo lo stesso Stable potrebbe essere usato per assegnare a qualsiasi cavallo, se disponibile, (o un particolare) stallo vuoto, o rimuovere un incarico di un cavallo per restituire uno stallo a un compito vuoto.

La creazione del cavallo (oggetto) sarebbe separata dalla creazione Stabile (oggetto).

Tuttavia , ciò a cui stai alludendo con la nozione del conteggio di MaxStableRooms , ma non correttamente la modellazione , è la distinzione tra StableRoom s e Horse s.

Forse dovresti creare un StableRoom come una propria classe / entità.

Ora puoi avere composizione di StableRoom s con Stable e aggregazione di Horse s su StableRoom s.

Un StableRoom ha senso per essere distrutto quando Stable viene distrutto, ma quando viene distrutto il Horse s assegnato a StableRoom s viene reso senza dimora ma non distrutto .

Creando una nozione di prima classe di StableRoom , ogni StableRoom ha il potenziale per avere qualità differenziate, come cavalli massimi, porte adiacenti ecc ...

(In un caso analogo con HotelRooms, avresti numero di letti, vasca idromassaggio, vista oceano vs piscina, categoria tariffazione, ecc.)

Inoltre, se avevi bisogno di incarichi più complessi (come sarebbe necessario per hotel, camere d'albergo e persone) potresti avere un'altra classe (o serie di classi) coinvolta nella pianificazione e amp; calendario e prenotazioni piuttosto che farlo interamente all'interno della classe Stable.

    
risposta data 27.09.2016 - 19:21
fonte
3

Verifica le tue relazioni is-a e has-a . "is-a" è ereditarietà. "has-a" è composizione.

So Horse "è un" animale è eredità. Stabile "ha un" cavallo (o cavalli) è composizione.

    
risposta data 27.09.2016 - 16:43
fonte
1

Il tuo esempio di codice è un caso di contenimento .

La composizione è un termine sfocato che può significare qualsiasi cosa. Suggerisco di non usarlo. I due termini del contatore che vuoi capire sono aggregazione rispetto a contenimento .

Con il contenimento, l'oggetto interno è completamente incapsulato dall'oggetto esterno, quindi non direttamente accessibile dall'esterno dell'oggetto esterno. Devi chiedere gentilmente all'oggetto esterno e sperare che passi il messaggio all'oggetto interno.

Con l'aggregazione, l'oggetto esterno pubblica l'interfaccia dell'oggetto interno (suo riferimento) in modo che l'oggetto interno sia accessibile oltre il controllo dell'oggetto esterno.

Tipicamente, con il contenimento l'oggetto interno è un membro dell'oggetto esterno dove non è con l'aggregazione, ma non è necessariamente il caso.

    
risposta data 27.09.2016 - 21:59
fonte

Leggi altre domande sui tag