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.
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 :)
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.
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).