Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 2013
-
17 août 2006 à 16:12
cs_neko
Messages postés135Date d'inscriptionjeudi 14 août 2003StatutMembreDernière intervention12 octobre 2006
-
20 août 2006 à 09:53
salut tout le monde, une question me vient concernant l'heritage et la surcharge.
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 18 août 2006 à 09:08
justement, c'est ce que je veux pas, je veux pas faire un test a chaque fois pour caster. c'est ce que j'ai en ce moment. je voudrais faire autrement.
En fait j'ai une dizaine de classes qui heritent de la classe mere, et je veux que ca fasse appel à la methode correspondant a une des sous classes si elle existe, et sinon appeler la methode correspondant à la classe mere.
voici plus de precisions:
classe mere CM
10 classes C1..C10 heritant de CM
dans chaque sous classe C1..C10, j'ai des methodes correspondant a certaines des autres classes. par exemple, j'ai la classe C1 qui a les procedures:
proc(C1);
proc(C3);
proc(C5);
proc(C6);
proc(C9);
proc(CM); //celle ci doit etre appelee si le parametre n'est ni C1 ni C3 ni C5 ni C6 ni C9.
cs_neko
Messages postés135Date d'inscriptionjeudi 14 août 2003StatutMembreDernière intervention12 octobre 20061 18 août 2006 à 14:46
Ha ok, j'avais pas capté que tu voulais ça avec des méthodes ( ton exemple le montrait pas du tout ) ^^
A ce moment-là il faut que tu utilise les directives Virtual et Override
La directive Virtual sert en gros ( en très gros même ) à dire que la
méthode donnée sera définie en fonction du constructeur et pas de la
class de déclaration.
La directive Override sert (toujours en gros) a surcharger une méthode virtual ( ou dynamic )
TPere = class
public
//distribuer sert juste a etre appele dans la sous classe,
//elles ont toutes la meme implementation
procedure distribuer(param:TPere);virtual; abstract;
end;
TFils1 = class(TPere)
public
//forcement une methode avec le parametre de la meme classe
procedure p(param: TFils1); overload;
//des methodes pour une ou plusieurs des autres TFilsX
procedure p(param: TFils3); overload;
//forcement une methode pour la classe TPere
procedure p(param: TPere); overload;
// implementation de distribuer
procedure distribuer(param:TPere); override;
end;
point important : si une classe fils A n'a pas de procedure pour un autre fils B, alors B a la procedure pour A
par exemple, si il n'y a pas TFils2.p(param:TFils3), alors il y a TFils3.p(param:TFils2)
donc les procedures dont le parametre est TPere sont comme ca:
procedure TFilsX.p(param: TPere);
begin
param.distribuer(self);
end;
et mon probleme et que quel que soit le type de parametre que je lui passe, il appele toujours la methode p(param:TPere).
var
p1, p2 : TPere;
v1 : TFils1;
v2: Tfils2;
begin
p1 := TFils1.create;
v1 := TFils1.create;
p2 := TFils2.create;
v2 := TFils2.create;
//tout ces appels appelent la methode TFils1.distribuer(TPere);
p1.distribuer(p1);
p1.distribuer(p2);
p1.distribuer(v1);
p1.distribuer(v2);
v1.distribuer(p1);
v1.distribuer(p2);
v1.distribuer(v1);
v1.distribuer(v2);
end.
je t'envoie la source par pm.
merci
Vous n’avez pas trouvé la réponse que vous recherchez ?