Bonjour,

Je viens de faire un code représentatif de ce que je souhaite obtenir.

A savoir, déclarer une classe ancêtre ne connaissant que l'interface de l'objet, et dont l'instanciation fournisse un objet d'une classe descendante, qui implémente les méthodes. Afin de déléguer les détails du descendant à une autre unité ou librairie.

Ce type de code fonctionne en Delphi 5, mais je me heurte au portage sous Lazarus 0.9.30 FPC 2.4.2 Windows 7 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
type
  TMonAncetre = class(TObject) // classe de base
  private
    FField: integer;
  public
    constructor Create(aParam: integer); overload;
    function GetTruc: integer; virtual; abstract;
  end;
 
  TMonFils = class(TMonAncetre) // descendant chargé de l'implémentation
  private
    FTruc: integer;
  public
    constructor Create(aParam: integer);
    function GetTruc: integer;
  end;
 
constructor TMonFils.Create(aParam: integer);
begin
  inherited;
  FField:=aParam;
  FTruc:=-1;
end;
 
function TMonFils.GetTruc: integer;
begin
  Result:=FTruc*FField;
end;
 
function CreateFils(aParam: integer): TMonAncetre; // fonction (CallBack si déclarée ailleurs) qui crée l'objet désiré
begin
  Result:=TMonFils.Create(aParam);
end;
 
constructor TMonAncetre.Create(aParam: integer); // seule fonction à implémenter pour l'ancêtre
var
  temp: TMonAncetre;
begin
  // syntaxe initiale fonctionnelle en Delphi : self:=CreateFils(aParam);
  temp:=CreateFils(aParam);
  self:=temp; // le problème se pose là, je crois... mais pb de débugger
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  TestObject: TMonAncetre;
begin
  TestObject:=TMonAncetre.Create(123);
  ShowMessage(IntToStr(TestObject.GetTruc));
  TestObject.Free;
end;
Merci pour vos idées.