Mot-clé inherited et les fonction

Signaler
Messages postés
3
Date d'inscription
vendredi 22 février 2002
Statut
Membre
Dernière intervention
24 février 2002
-
Messages postés
3
Date d'inscription
vendredi 22 février 2002
Statut
Membre
Dernière intervention
24 février 2002
-
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

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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 :)
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Au lieu de :
Edit2.Text := IntToStr(B.UnEntier);

il faut lire :
Edit2.Text := IntToStr(B.GetEntier);
:blush)
Messages postés
3
Date d'inscription
vendredi 22 février 2002
Statut
Membre
Dernière intervention
24 février 2002

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 ;-)
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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+
Messages postés
3
Date d'inscription
vendredi 22 février 2002
Statut
Membre
Dernière intervention
24 février 2002

Merci pour le conseil ;-) @+