Mot-clé inherited et les fonction

cs_JesseJames Messages postés 3 Date d'inscription vendredi 22 février 2002 Statut Membre Dernière intervention 24 février 2002 - 22 févr. 2002 à 14:45
cs_JesseJames Messages postés 3 Date d'inscription vendredi 22 février 2002 Statut Membre Dernière intervention 24 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.

5 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TClasseA= class
private
FUnEntier: integer;
procedure SetUnEntier(const Value: integer);
property UnEntier : integer read FUnEntier write SetUnEntier;
public
function GetEntier:integer;virtual;
end;

TClasseB = class (TClasseA)
public
//property UnEntier; (facultatif ici)
function GetEntier : integer ; override;
end;

TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

{ TClasseA }

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 :)
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
22 févr. 2002 à 19:58
Au lieu de :
Edit2.Text := IntToStr(B.UnEntier);

il faut lire :
Edit2.Text := IntToStr(B.GetEntier);
:blush)
0
cs_JesseJames Messages postés 3 Date d'inscription vendredi 22 février 2002 Statut Membre Dernière intervention 24 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.

Merci ;-)
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_JesseJames Messages postés 3 Date d'inscription vendredi 22 février 2002 Statut Membre Dernière intervention 24 février 2002
24 févr. 2002 à 21:15
Merci pour le conseil ;-) @+
0
Rejoignez-nous