cs_JesseJames
Messages postés3Date d'inscriptionvendredi 22 février 2002StatutMembreDernière intervention24 février 2002
-
22 févr. 2002 à 14:45
cs_JesseJames
Messages postés3Date d'inscriptionvendredi 22 février 2002StatutMembreDernière intervention24 février 2002
-
24 févr. 2002 à 21:15
salut, j'ai un problème qui me torture la vie, help !
Ayant 2 classes, A et B, A était la super-classe et B une classe fille.
la méthode (fonction) de A, implémentée, renvoie un entier --> TClasseA.GetEntier : integer; virtual;
Dans la classe B, celle-ci est surchargé (override).
Comment faire dans B pour appeler la méthode de A ? J'ai essayé différentes syntaxe sans succès, les voici :
1)
TClasseB.GetEntier : integer;
begin
inherited;
end;
//à la compilation, me marque "type incompatible" ??
2)
TClasseB.GetEntier : integer;
begin
inherited GetEntier;
end;
//passe la compilation, mais à l'éxécution, un access violation, pourtant mes deux classes sont instanciées.
3)
TClasseB.GetEntier : integer;
begin
result := inherited GetEntier;
end;
//idem que 2), mais est-ce nécessaire de réecrire le result, puisque la méthode mère, implémentée retourne également un entier ?
........................................................................
Voilà j'espère que vous pourrez m'aider, merci d'avance.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 22 févr. 2002 à 19:36
Deux solutions :
1- Soit la méthode TClassA.GetEntier est déclarée Abstract et devra donc être implémentée par les classes descendantes.
2- Soit tu hérites d'une méthode TClasseA.GetEntier déjà implémentée. Auquel cas, la classe devra déjà être capable de "stocker" une valeur avant l'appel à cette méthode. Exemple (qui fonctionne) :
unit Unit1;
function TClasseA.GetEntier: integer;
begin
Result := FUnEntier;
end;
procedure TClasseA.SetUnEntier(const Value: integer);
begin
FUnEntier := Value;
end;
{ TClasseB }
function TClasseB.GetEntier: integer;
begin
Result := FUnEntier;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
B : TClasseB;
begin
B:=TClasseB.Create;
try
B.UnEntier:= StrToIntDef(Edit1.text, 0);
Edit2.Text := IntToStr(B.UnEntier);
finally
B.Free
end;
end;
end.
--------------------------------------------------------
Dans cet exemple, la classe B hérite bien des méthodes de la classe A et de sa capacité à mémoriser un résultat, en l'occurence dans une propriété privée.
Quand tu utilises le mot réservé Inherited, de quoi hérites tu si aucun comportement fondamental n'est défini pour méthode de la classe dont tu hérites ?
Si tu ne souhaites pas implémenter un minimum de code dans TClassA, alors déclares sa méthode GetEntier Abstract et procèdes à l'implémentation dans ses descendants.
J'espères que ma réponse aura été claire :)
cs_JesseJames
Messages postés3Date d'inscriptionvendredi 22 février 2002StatutMembreDernière intervention24 février 2002 23 févr. 2002 à 19:13
Salut, merci pour ton éclaircissement. J'ai suivi cet voie et tout à l'air de très bien joué. Abstact me permet de rendre mes méthodes filles plus indépendants par rapport à l'appel du type d'objet.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 23 févr. 2002 à 22:06
Le but de la directive Abstract n'est pas de rendre les "méthodes filles" plus indépendantes mais signifie que l'on n'implémente pas une méthode à ce niveau mais dans une classe qui HERITERA de cette classe.
C'est le principe à retenir quand on programme en utilisant les Interfaces avec COM. On déclare des méthodes (les fonctionnalités minima d'une classe) sans dire comment elles devront opérer pour fournir un résultat (méthodes abstraites).
Content de t'avoir dépanné.
A+
Vous n’avez pas trouvé la réponse que vous recherchez ?