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