Je crée une suite de tests automatisée en modélisant des classes après des pages web. Je teste les portails Web avec la même structure de base, mais des différences existent entre les portails. Pour les données et les méthodes communes à toutes mes pages Web sur tous les portails, je souhaite que les classes héritent d'une classe, BasePage
. Il existe également des méthodes communes à toutes les pages Web pour un portail particulier qui n'existent pas sur d'autres portails, donc j'aimerais hériter d'une classe, <portal name>.BasePage
.Solutions pour hériter de deux groupes distincts de classes sans Interfaces
Ici, c'est difficile. Je veux également hériter des méthodes du type de page sur lequel je suis, par exemple. BaseForgotPasswordPage
. Si mon test accède à la page Mot de passe oublié d'un portail particulier, j'instancie <portal name>.ForgotPasswordPage
et je souhaite qu'il accède aux méthodes en BasePage
, BasePortalPage
et BaseForgotPasswordPage
. Cette classe feuille doit hériter à la fois de BasePortalPage
et de BaseForgotPasswordPage
, ce que Java n'autorisera pas pour de bonnes raisons. Ils ne peuvent pas non plus hériter l'un de l'autre sans créer une quantité ridicule de classes car BaseForgotPasswordPage
s'applique à tous les portails, pas seulement un. Là réside le problème. L'utilisation d'Interfaces conduira à dupliquer le code entre les différentes classes et je veux garder mon code DRY, ce qui ne servira à rien. La consolidation des classes de base donnera un comportement de page qu'il ne devrait pas avoir. Par exemple, si je fusionne ForgotPasswordPage
en BasePage
, chaque page Web aura des méthodes applicables uniquement à la page Mot de passe oublié.
Une contrainte possible qui pourrait faciliter la complexité de la conception est l'interdiction de données dans l'une des classes comme BaseForgotPasswordPage
. En effet, cette classe devient un module et n'aura pas besoin d'être héritée. Bien que pas aussi propre d'une approche, c'est la seule solution viable que je pourrais penser. Toute autre suggestion serait la bienvenue.
C'est un peu difficile de répondre car je ne sais pas à quoi ressemble chaque classe. Que diriez-vous de faire l'héritage à plusieurs niveaux - 1) BasePage 2) BasePortalPage étend BasePage 3) BaseForgotPasswordPage étend BasePortalPage? De même, vous n'avez pas besoin d'hériter pour réutiliser le code. Alternativement, certaines personnes pourraient aussi argumenter "Composition sur l'héritage". Vous pouvez simplement avoir l'objet et utiliser sa méthode et autres. Par exemple, BaseForgotPasswordPage a des objets d'instance pour BasePage et BasePortalPage. – Tin