|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Bonjour, j'essaye actuellement de bien comprendre le polymorphisme et l'héritage, pour cela je veux résoudre un exercice type : les employés d'une entreprise.
On souhaite gérer les différents employés d'une entreprise. Pour chacun on conserve son numéro de sécurité sociale et son nom. On souhaite également connaitre son emploi. L'entreprise a un patron, des vendeurs et des caissières. chaque employé, sauf le patron à un supérieur hiérarchique. Le patron touche son salaire ainsi qu'une prime de risque. Les vendeurs touchent une commission en plus de leur salaire. Les caissière touchent simplement leur salaire. Pour chaque employé on désir avoir les fonctions suivantes: - un constructeur - sePresenter qui permet d'écrire sur le terminal le numéro SS de l'employé, son nom et son emploi - revenu qui calcul le revenu de l'emplyé: salaire + prime ou commission s'il y a lieu -getsuperieur qui donne le supérieur hierarchique. Inclure une classe nommée CSS pour gérer le numéro de sécurité sociale. Concevez et programmez les différentes classes permettant de traiter le problème. Pensez au destructeurs et constructeurs de copie si besoin est. Aucune gestion d'erreur n'est demandée. Voila j'ai à peu près modéliser le problème comme suite : class employé : - CSS secu - string nom - string emploi +employe() constructeur +sePresenter() Virtuel pure donc classe abstraite +revenu() virtuel pure + getsuperieur() virtuel pure ~employe() destructeur virtuel class patron: - double salaire - double prime +patron() +sePresenter() +revenu() +getsuperieur ~patron() class vendeur: - double salaire - double commission +vendeur() +sePresenter() +revenu() +getsuperieur ~vendeur() class caissiere: - double salaire +caissiere() +sePresenter() +revenu() +getsuperieur ~caissiere() Voila j'ai ainsi pu programmer les différentes classes. Mais il reste quelque chose qui me taquine. En effet, le salaire étant présent dans les trois sous-classes, je me demande s'il n'était pas plus judicieux de l'envoyer dans la classe employé . Si quelqu'un peut m’éclaircir sur ce point ce serait cool. Merci |
|
|
00
|
|
|
#2 |
|
Membre éclairé
![]() ![]() Guillaume GomezÉtudiant Inscription : mai 2010 Messages : 161 ![]() |
Il paraîtrait logique de le mettre dans la classe mère pour que les classes l'ait directement. Ça évitera d'avoir à le refaire dans chaque classe. Tu aurais pu faire une classe abstraite au lieu d'une interface pour la classe mère, ça t'aurais éviter d'avoir à redéfinir les fonctions dans chaque classe fille car je présume que le code pour getSuperieur doit être le même à chaque fois...
|
|
|
10
|
|
|
#3 |
|
Invité régulier
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Merci pour la réponse rapide
. J'avais un doute parce que dans un livre, j'ai trouvé un exercice similaire mais il mettait le salaire dans les sous classes sous prétexte qu'il en avait besoin pour calculer le revenu, bref ça m'a parut bizarre.Sinon pour le constructeur de copie, comment savoir s'il y en a besoin ou pas ? D'après ce que j'ai compris, dès qu'il y a des pointeurs il faut penser au constructeur de copie. Ce qui me fait penser qu'on en a besoin surtout pour la classe mère ( employé) , je me trompe ? |
|
|
00
|
|
|
#4 | ||
|
Membre éclairé
![]() ![]() Guillaume GomezÉtudiant Inscription : mai 2010 Messages : 161 ![]() |
Un bon exemple de constructeur par copie :
Code :
|
||
|
|
11
|
|
|
#5 |
|
Invité régulier
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Merci beaucoup j'ai compris l'idée en ce qui concerne les constructeur de recopie.
Donc pour l'héritage c'est vraiment strict : chaque attribut qui se répète dans les sous classes doit être factorisé dans la classe de base. Merci, je vais pouvoir programmer mes classes sans hésitation. Bonne journée
|
|
|
00
|
|
|
#6 |
|
Membre éclairé
![]() ![]() Guillaume GomezÉtudiant Inscription : mai 2010 Messages : 161 ![]() |
C'est pas une obligation, c'est juste pour éviter d'avoir à répéter sans cesse le même code qu'on le fait (et ça fait aussi partie du principe de l'héritage).
|
|
|
10
|
|
|
#7 |
|
Invité régulier
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Oui, je comprend que c'est pas une obligation, mais dans un exercice comme ça, ça montre qu'on a compris le concept quoi
|
|
|
00
|
|
|
#8 | ||||||
![]() ![]() |
Citation:
Citation:
Citation:
Citation:
Il existe deux grands "groupes" de classes en fonction de la sémantique qu'elles ont : Les classes à sémantique de valeur, dont il est possible d'avoir, à un instant T, plusieurs instances en mémoire présentant exactement les même valeurs. C'est le cas, par exemple, des classes "couleurs", "point", "réservoir à essence", "adresse", etc. Bref, tout ce qui peut exister en plusieurs exemplaires scrupuleusement identiques. Ces classes sont, généralement:
Si, parmi les trois fonctions importantes que sont le constructeur par copie, l'opérateur d'affectation et le destructeur, il y en a une dont le comportement doit être définis (comprend : dont tu ne peux pas te contenter d'utiliser le comportement par défaut implémenté par le compilateur), alors, il faudra envisager de définir les trois Ensuite, il y a les classes ayant sémantique d'entité, dont chaque instance est identifiée de manière unique et non ambigüe. C'est le cas de classes comme "personne", "véhicule", "compte bancaire". Bref, toutes les classes pour lesquelles chaque instance doit être scrupuleusement unique pour avoir la certitude que si tu modifie une des données (parmi celles qui peuvent être modifiées) d'une instance quelconque, la modification s'applique effectivement à cette instance particulière. Ces classes sont généralement
En C++ (avant la nouvelle norme), cela se traduisait souvent par le fait de déclarer le constructeur par copie et l'opérateur d'affectation comme étant privés sans les définir. En C++11, il est possible de simplement les déclarer comme "deleted", sous une forme proche de Code :
__________________
en bas de page
|
||||||
|
|
20
|
|
|
#9 |
|
Invité régulier
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Merci pour l'explication vraiment bien détaillée
, je pense avoir bien compris l'idée.Sinon que veux-tu dire par "hors variation du montant" ? Car d'après l'énoncé, je pense que le salaire peut varier en fonction en fonction de chaque employé ( il peut paraître logique que le salaire du patron ne soit pas le même que celui de la caissière par exemple) |
|
|
00
|
|
|
#10 | |
![]() ![]() |
Citation:
Il faudra donc prévoir de fournir cette information au niveau du constructeur de la classe mère, et voir s'il est plus cohérent de le fixer au niveau du constructeur des classes dérivées ou, au contraire, de permettre de le définir séparément pour chaque employé Il serait d'ailleurs tout à fait envisageable d'avoir une optique différente en fonction du type d'employé, en offrant un salaire fixe aux caissières, mais en permettant de définir le salaire des vendeurs et du patron, par exemple
__________________
en bas de page
|
|
|
|
10
|
|
|
#11 | |||
![]() ![]() Inscription : juin 2002 Messages : 2 034 ![]() |
Citation:
Pour utiliser la surcharge de l'opérateur =, il faudrait écrire : |
|||
|
|
30
|
|
|
#12 | ||
|
Invité régulier
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Ok je vois ce que tu veux dire, donc si par exemple je veux fixer le salaire des caissières à 1300€ par exemple. Je dois appeler le constructeur de la classe mère en initialisant le salaire à 1300.
Code :
|
||
|
|
00
|
|
|
#13 | ||
![]() ![]() |
A peu de choses près, les erreurs en moins, oui, c'est ca
En fait, cela ressemblerait à quelque chose comme Code :
__________________
en bas de page
|
||
|
|
10
|
|
|
#14 |
|
Invité régulier
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Merci, j'ai vu mon erreur, en fait il ne faut pas passer le salaire en paramètre pour les caissières si je veux le "forcer" à 1300. C'est un peu comme l'emploi dans les sous classes patron,vendeur et caissière. Si j'ai bien compris, il faut en quelque sort cacher l'opération de sorte à ce qu'on ne puisse plus le redéfinir, et ce pour chaque nouvelle caissière.
Merci en tout cas ton aide m'a été précieuse. Je met en résolu. Bonne journée
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com