2. Le principe a priori, pour te simplifier le travail, c'est que tu mutualises tout ce qui peut être mutualisé dans la superclasse abstraite Module. Que ce soient des variables, des implémentations de méthodes, des méthodes abstraites, etc... (note qu'en Java il y a un moyen d'empêcher que des méthodes non abstraites de la superclasse soient réécrites par l'une des classes filles : ajouter le mot "final"). Donc,
personnellement, si je sais qu'une méthode (y compris le constructeur) est exactement la même dans toutes les sous-classes, j'aurais tendance à l'implémenter dans la classe mère pour éviter des inconsistances si je fais des copier-coller dans les classes filles (on peut oublier de copier des changements apportés à la même méthode dans toutes les sous-classes concernées, par exemple, ce qui n'est pas chouette

)