Bonjour Omar,
Tu as tout à fait raison, dans ton cas Java ne permet aucune solution évidente puisque tu es obligé de rédéfinir soit la fonction 'danse' soit la fonction 'chante', ce qui augmente considérablement le travail. Java n'autorise pas l'héritage multiple (et contrairement à ce que l'on peut lire un peu partout, les interfaces ne permettent pas de faire d'héritage multiple mais autorisent seulement un cas particulier pour les classes abstraites) et, si tu as besoin de ce type de fonctionnalités, je te conseille de t'orienter sur du C++, qui sera beaucoup plus puissant.
Sinon, une bidouille (mais qui rajoute aussi du boulot) :
Tu crées deux interfaces : IChanteur et IDanseur, puis deux classes Chanteur et Danseur implémentant IChanteur et IDanseur.
Ensuite pour ta classe Jackson, tu lui fais implémenter les interfaces IChanteur et IDanseur et (c'est toute l'astuce) pour ne pas réécrire ton code, tu places deux données privées 'c' et 'd' respectivement de type Chanteur et Danseur et tu appelles leurs méthodes dans les définitions des fonctions de IChanteur et IDanseur de la classe Jackson. C'est nul et pas performant mais je n'ai pas encore trouvé d'autre solution.
Charly