But does it also imply that each association could be with different subclasses of Contact.
No, it implies that anything that is instantiated as a specialisation of Contact has two associations inherited from Contact to a set of objects instantiated as instances of Roles (depending on the multipicities on the two Contact-Role associations).
By way of example, a (specific) Person, let's call him "Bruce", is an instance of a Contact - and therefore inherits all the attributes of a Contact, including the two associations with some as yet uninstantiated Role objects. Now quickly, create another set of objects:
Person p2=new Person("Peter");
Person p3=new Person("John");
Person p4=new Person("thomaskillan");
Organization o1=new Organization("Saperion");
Group g1=new Group("EAForum:);
Now, lets start instantiating some Roles (given that the constructor for Role is Role(Contact sourcecontact, Contact targetcontact, string roletype);
Role r1=new Role(p2, g1, "asks"); // Peter asks the EAForum
Role r2 = new Role(p1,p2, "doesn't understand') // Bruce doesn't understand Peter('s question)
Role r3 = new Role(p3,p2, "understands") // John understands Peter
Role r4 = new Role(p4, o1, "works at"); // thomaskillen works at Saperion
Finally, create the associations for the Contacts, viz:
(nb the way I am thinking, the Contact source and target attributes are collections)
p2.source.add(r1) // Peter acts as the source contact in r1
g1.target.add(r1) // EAForum is a target in r1
p2.target.add(r2) // Peter is a target in r2
etc etc ...
(Now, you wouldn't implement this is such a stepwise manner, I only did it to show how the relationships are creatable regardless of the spercialization types)
hth
Bruce
p.s. by way of summary - anything that is a Contact can be involved in any number of relationships with any other things that are contacts - either as the source in the role or as the target in the role.