Bonjour,
Je suis confronté a un problème de polymorphisme, et a chaques fois que je trouve une solution ça apporterait d'autres problèmes alors je fais appel à vous.
Voila j'ai 3 classes :
employe,
membre (dérivé d'employé),
utilisateur (dérivé de membre)
Ces classes sont persistantes, et suivent le mème modèle au niveau de la base de données.
Chaque classe possède les méthodes suivantes :
toEmploye(),
toMembre(),
toUtilisateur().
Des instances de ces trois types différents sont stockées dans une collection.
Ce modèle me permet a partir d'un indice dans la collection, de basculer d'un type a l'autre de manière très transparente. de ce fait, je n'ai pas a connaitre le type d'origine, je sais que la conversion sera faite sans problèmes.
Ainsi si un utilisateur dois devenir utilisateur, il se mettra simplement à jour (avec les valeurs en paramètre ici non présentes).
Avec ce modèle il est clair qu'un utilisateur dois impérativement être avant tout membre.
Voici donc un cas d'utilisation :
Un employé est sélectionne, puis on veux le transformer en utilisateur, il se passe donc :
1/ on transforme d'abord en membre, afin de récupérer une partie des nouvelles informations spécifiques a membre.
2/ on transforme en utilisateur avec les dernière informations.
Maintenant on part du principe qu'un utilisateur est sélectionne :
1/ on converti en membre, donc perte de l'information en détruisant son num de la table utilisateur.
2/ Etant donné que c'est un utilisateur et qu'on lui demande d'en devenir un, il se mettra simplement a jour, et tentera de se modifier en base, alors qu'il viens de se supprimer.
LA solution qui résoudrait tout serait d'éviter une appel de modification vers autres membre quand on est utilisateur, seulement dans ce cas, si on reprend l'exemple numéro un, utilisateur ne sera plus transformé en membre avant de devenir utilisateur, donc ca coincerais a ce niveau la.
Ici la solution serait de pouvoir savoir si l'objet sur lequel on agi est de type utilisateur, et ne pas appeler la conversion vers Membre, mais dans ce cas je perd en partie l'avantage de la polymorphie.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 switch(cbTypePersChoix->SelectedIndex) { case 0: ((employes^)objGestListe::listEmployes[lbPers->SelectedIndex])->toTechniciens(); break; case 1: ((employes^)objGestListe::listEmployes[lbPers->SelectedIndex])->toJardiniers(); break; case 2: //Si en plus c'est un user alors on complète ((employes^)objGestListe::listEmployes[lbPers->SelectedIndex])->toAutresMembres(newStatut); if(chbUser->Checked) { ((employes^)objGestListe::listEmployes[lbPers->SelectedIndex])->toUtilisateurs(txtPersIdent->Text, txtPersPass->Text); } break; }
Si l'un de vous à une idée.
Je sais pas si j'ai posté au bon endroit (j'aurais peut-être du poser dans conception), si il n'est pas a la bonne place, qu'un modérateur n'hésite pas a le déplacer.
Partager