Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : mot-clé inherited et les fonction [ Archives / J'AI BESOIN D'AIDE !!!! :O ] (JesseJames)

vendredi 22 février 2002 à 14:45:39 | mot-clé inherited et les fonction

JesseJames

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.

vendredi 22 février 2002 à 19:36:47 | Re : mot-clé inherited et les fonction

Delphiprog

Administrateur CodeS-SourceS
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

vendredi 22 février 2002 à 19:58:18 | ERRATUM

Delphiprog

Administrateur CodeS-SourceS
Au lieu de :
Edit2.Text := IntToStr(B.UnEntier);

il faut lire :
Edit2.Text := IntToStr(B.GetEntier);

samedi 23 février 2002 à 19:13:14 | Re : mot-clé inherited et les fonction

JesseJames

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 ;-)

samedi 23 février 2002 à 22:06:25 | Directive ABSTRACT

Delphiprog

Administrateur CodeS-SourceS
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+

dimanche 24 février 2002 à 21:15:39 | Re : Directive ABSTRACT

JesseJames

Merci pour le conseil ;-) @+



Cette discussion est classé dans : fonction, classe, integer, inherited, getentier


Répondre à ce message

Sujets en rapport avec ce message

Perte de donnée [ par Spikto ] Bonjour j'ai une fonction qui permet de découper un variable de type texte mais j'ai des lettre qui disparaisse de temps en temps.Voici ma fonction ty Comment implémenter des classes en delphi? [ par furax13 ] bonjour,j'ai plusieurs classes à créer en delphi.<span lang="FR" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-ansi-lang tableau dynamique à deux dimensions dans une classe [ par Koraluv ] Salut à tous!Je suis débutante en delphi et je voudrai créer une classe qui ai comme attribut un tableau dynamique à deux dimentions de TCellule.je l' override et Inherited d' une fonction avec resultat. [ par MAURICIO ] Salut à tous, je fais le override d' une fonction comme ça dans un des mes compos: protected  procedure FontionXYZ: Boolean; override;j' aimerai faire type d'une fonction interne (pointeur de methode, procedure normale, ...) [ par Guillemouze ] salut a tous.Ce n'est pas un probleme que j'ai, c'est juste une question que je me pose.Quel est le type d'une procedure interne?je m'explique, si on Comment acceder au procédure d'une interface ? [ par mathdu57 ] Bonjour ! J'ai un petit soucis. Comment accéder au procédure d'une interface ? Je m'explique : J'ai une classe main ou j'instancie un objet ActiveX classe d'exeption EAccessViolation (violation d'accese) [ par hhakim1 ] bonjour j'ai un probleme dans l'execution de mon application , le projet a provoqué une classe  d'exception EAccessViolation avec le message ' violati ModelMaker - Doublage de la ligne de vie [ par xpmich ] Bonjour à tous,J'utilise actuellement DELPHI 7 et ModelMaker 6.20.ModelMaker est en partie un éditeur UML pour DELPHI.Je souhaite réaliser un diagramm GetUserName [ par ytillang30400 ] Bonjour. La fonction : "Windows.GetUserName" permet de connaitre le user de la session en cours. Exemple : "MIMI" Mais si je modifie le mom. Exemple " Fonction qui permet de convertir une chaine de caractère en tout lettre [ par cansrya ] Fonction qui permet de convertir une chaine de caractère en tout lettreMerci


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,468 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.