Ceci peut ou non être une réponse à votre exercice. Si j'avais ces exigences dans le monde réel, je les remanierais. (Bien sûr, dans le monde réel, j'aurais également beaucoup de questions sur les raffinements et les détails supplémentaires). La situation dans le monde réel est (on peut le supposer) que nous avons affaire à des personnes qui ont toujours un nom et un prénom. Puisque les noms et prénoms ne changent pas (on peut aussi le supposer) lorsque la personne est spécialisée dans des sous-classes, il n'y a aucune raison de fournir un moyen de les implémenter différemment dans les sous-classes. Il n'y a donc aucune raison de rendre la classe person abstraite, puisque c'est pour cela que l'on fait des classes abstraites.
C'est également une situation où l'agrégation (une classe "a" d'autres classes) est plus logique que l'héritage (une sous-classe "est" une super-classe). Je restructurerais donc les exigences de cette façon :
Personne : Nom, prénom Étudiant : École, notes Travailleur : Salaire
La classe Person peut "avoir" de zéro à une classe Student. La classe Personne peut "avoir" de zéro à une classe Travailleur.
Le fait que Person doive être abstrait implique également qu'une personne doit être soit un étudiant, soit un travailleur, soit les deux. Cela peut être spécifié par un or
contrainte entre les deux classes.
Voici un schéma :
La classe Personne a une relation d'agrégation avec les classes Étudiant et Travailleur. Une classe de personne peut avoir de zéro à une classe d'étudiant. Une classe de personne peut également avoir de zéro à une classe de travailleur. Le site {or}
La contrainte précise en outre qu'il doit y avoir un étudiant ou un travailleur, ou un de chaque.