Hi all I've got a non-obvious class hierarchy with interfaces involved. The problem is that, I thought "property ... implements ...;" construction fully substitute for implementing interface methods in class itself, but now it's just not true. I get different results in case implements is used and when it isn't.
If I comment implements implementation, my results are: TClassBase.Print 3 TClassBase.Print 3 TClassBase.Print 3 If I use implements, my results are: TClassBase.Print 3 TClassBase.Print 3 TClassBase.Print 30 See my example below. I wonder if it is by design? I have similar bug posted on bug tracker under http://bugs.freepascal.org/view.php?id=14842 ====================================== program project1; {$mode objfpc}{$H+} type IIntf1 = interface ['{925B72C3-B47D-432A-AED8-544B3306055B}'] end; IIntf2 = interface ['{E5C9BAC0-CE6D-42A8-BC85-F0AA51360E83}'] procedure Print; end; { TClassBase } TClassBase = class(TInterfacedObject, IIntf2) Int:Integer; procedure Print; end; { TClass1 } TClass1 = class(TClassBase, IIntf1) public constructor Create; end; { TClass2 } TClass2 = class(TClassBase, IIntf1) private FIntf: IIntf1; public constructor Create; property Intf:IIntf1 read FIntf implements IIntf1; //COMMENT THIS LINE end; { TClassBase } procedure TClassBase.Print; begin WriteLn('TClassBase.Print ', Int); end; constructor TClass2.Create; var O:TClass1; begin Int:=3; O:=TClass1.Create; O.Int:=30; FIntf:=O; end; { TClass1 } constructor TClass1.Create; begin Int:=1; end; var C2:TClass2; I1:IIntf1; I2:IIntf2; begin C2:=TClass2.Create; C2.Print; I1:=C2 as IIntf1; I2:=C2 as IIntf2; I2.Print; I2:=I1 as IIntf2; I2.Print; end. ====================================== -- Best regards, Denis Golovan
_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal