Hi,

I tested the attached program under Delphi 7 and FPC 2.6.0 and FPC 2.7.1
(dated 2012-11-15).

The test application tests two things:
  1) Interface delegation via another class
  2) Overriding a interface implementation using method resolution


Under Delphi 7 the test application compiles and runs as expected.

Under FPC (both 2.6.0 and 2.7.1)
 - I get a compiler error. I thought interface delegation was
   supported in FPC?
 - I also get a compiler crash with an AV - in both versions.



Isn't interface delegation supported in FPC?

Is method resolution supported in FPC?

Why does the compiler crash while compiling?



----8<-------------8<-------------8<-------------8<-------------8<----
Free Pascal Compiler version 2.6.0 [2011/12/23] for x86_64
Copyright (c) 1993-2011 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling test.pas
test.pas(38,76) Error: Class "TMyIntfClass" does not implement interface
"IMyIntf"
Fatal: Compilation aborted
An unhandled exception occurred at $000000000054CA3D :
EAccessViolation : Access violation
  $000000000054CA3D
  $0000000000532148
  $000000000056CEF4
  $000000000042392F
----8<-------------8<-------------8<-------------8<-------------8<----



The expected output when running the test application should be:

----------------------------------------------------------
c:\Programming\test\interface_delegation_2>test
TMyIntfClass.P1
TMainForm.MyP2

----------------------------------------------------------


Regards,
  - Graeme -

-- 
fpGUI Toolkit - a cross-platform GUI toolkit using Free Pascal
http://fpgui.sourceforge.net/

program test;

{$ifdef FPC}
  {$mode objfpc}{$H+}
{$else}
  {$APPTYPE CONSOLE}
{$endif}

uses
  Classes;

//--------------  Interface  ------------------

type

  IMyIntf = interface(IInterface)
  ['{ED858BD2-0E49-4B42-861D-6F415A7C0CF0}']
    procedure P1;
    procedure P2;
  end;


  { Delegation class.
    NOTE: Documenatation suggested we use the TAggregatedObject, but
      under Delphi 7 (at least) we can use TObject too. }
  TMyIntfClass = class(TObject)
  private
    { IMyIntf implementation }
    procedure P1;
    procedure P2;
  end;


  TMainForm = class(TComponent, IMyIntf)
  private
    FMyIntfClass: TMyIntfClass;
    { delegate IMyIntf implementation to another class }
    property MyIntfClass: TMyIntfClass read FMyIntfClass implements IMyIntf;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Run;
    { overrides the IMyIntf.P2 implementation using name resolution }
    procedure IMyIntf.P2 = MyP2;  
    procedure MyP2;
  end;



//--------------  Implementation  ------------------


procedure TMyIntfClass.P1;
begin
  Writeln(Classname + '.P1');
end;

procedure TMyIntfClass.P2;
begin
  Writeln(Classname + '.P2');
end;



constructor TMainForm.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FMyIntfClass := TMyIntfClass.Create;
end;

destructor TMainForm.Destroy;
begin
  FMyIntfClass.Free;
  inherited Destroy;
end;

procedure TMainForm.Run;
begin
  (self as IMyIntf).P1;
  (self as IMyIntf).P2;
end;

procedure TMainForm.MyP2;
begin
  Writeln(Classname + '.MyP2');
end;



// ----- Application starting point  -----
var
  frm: TMainForm;
begin
  frm := TMainForm.Create(nil);
  try
    frm.Run;
  finally
    frm.Free;
  end;
end.
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to