Non fornirò il diagramma perché si tratta ovviamente di una sorta di compiti a casa. Ma qui alcuni suggerimenti:
Le basi
Each train class has one and only one DiningCar
wagon, at least one
FirstClass
wagon and at least one TouristClass
wagon.
Innanzitutto, intuitivamente, DiningCar
, FirstClass
e TouristClass
offrono diversi servizi e comportamenti. Ad esempio, non ti aspetteresti che FirstClass
offra una funzione getNumberOfFreeRestaurantTables()
, mentre ci si aspetterebbe che DiningCar
faccia. Quindi specializzato il Wagon
sembra una buona idea.
Each train class has one and only one ... at least one ...
and at least one ....
Devi tradurlo in associazioni tra Train e le tue specializzate Wagon
classes. Per ogni associazione puoi specificare la molteplicità .
Il più elaborato
Poiché esiste un'associazione a parte intera tra Train
e il suo Wagons
, puoi prendere in considerazione l'utilizzo di un aggregazione al posto di una normale associazione.
Dato che un carro potrebbe essere rimosso da un treno e collegato a un altro treno, possiamo ipotizzare che l'aggregazione sia l'alternativa corretta e che composition non soddisfa i bisogni.
Ci sono altri approcci?
Certo! Non potresti specializzarti su Wagon
e lasciare che Wagon
abbia una proprietà che indichi di che tipo si tratta.
L'associazione di aggregazione tra Train
e Wagon
dovrebbe quindi avere una molteplicità che dice che ci sono almeno il 3% diWagons
(uno di ciascuno).
Ma come esprimeresti che esiste esattamente un% di% di% su almeno uno dell'altro tipo? Bene, potresti considerare di scrivere un vincolo per l'associazione. L'espressione OCL per esprimere formalmente questo vincolo è comunque molto meno auto-esplicativa del nostro approccio iniziale con la specializzazione ...