Prima correzione (consigliata):
In primo luogo, UML non è Java. La relazione tra Book
, Sword
o Stuff
classi su un lato e Item
classe sull'altro è mostrata con un generalization , e non c'è bisogno di etichettare la freccia con Extends
. Non c'è alcuna confusione possibile in questo diagramma UML con una relazione di realizzazione (cioè "implementazioni"), poiché quest'ultimo sarebbe mostrato con una linea tratteggiata .
Seconda correzione (richiesta):
La tua narrazione è incoerente con il tuo diagramma. Nella tua domanda hai menzionato un Character
che può essere un Monk
o un Palladin
, ma il tuo diagramma suggerisce che Palladin
in un tipo di Monk
(in base alla relazione di generalizzazione visualizzata, Monk
sarebbe il concetto più generale e Palladin
sarebbe un tipo di Mistico più specializzato). Questo è confusionario.
Punto di partenza
Quindi il diagramma di partenza potrebbe essere simile a:
Relazione che vuoi mostrare:
Vuoi mostrare che un Character
può avere in qualsiasi momento solo un Item
. Quindi, in pratica, questo significa che hai una relazione tra Character
e zero o uno ( 0..1
) Items
che può essere letto come "proprietario" (il personaggio possiede un oggetto). Viceversa, un Item
può essere posseduto da zero o un Character
.
Questo sarebbe mostrato come segue:
Sfortunatamente, questo permetterebbe a qualsiasi personaggio di possedere qualsiasi tipo di oggetto. Se vuoi limitare questo, devi utilizzare un vincolo UML . Questo viene fatto usando una casella di commento e inserisci un vincolo tra parentesi graffe {...}
. Il modo formale di fare sarebbe usare il linguaggio OCL. Ma un approccio più pratico è quello di documentare la contraint in lettere semplici:
Qui, il contraint è mostrato sull'associazione. È pratico, dal momento che è possibile aggiungere altri vincoli per altri tipi di personaggi. Tuttavia, potresti anche scegliere di mostrare il vincolo per la classe Monk
(e altre classi che hanno le loro associazioni vincolate).