tw18058a.pp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. { %fail }
  2. {$ifdef fpc}{$mode objfpc}{$H+}{$endif}
  3. uses
  4. Classes;
  5. type
  6. IIntf1 = interface
  7. ['{87776F0F-8CE0-4881-B969-C76F5A9CA517}']
  8. procedure M1;
  9. end;
  10. IIntf2 = interface
  11. ['{923C47DF-0A7E-4698-98B8-45175306CDF2}']
  12. procedure M2;
  13. end;
  14. { TObjIntf2 }
  15. TObjIntf2 = class(TInterfacedObject, IIntf2)
  16. procedure M2;
  17. end;
  18. { TObj }
  19. TObj = class(TInterfacedObject, IIntf1, IIntf2)
  20. private
  21. FObjIntf2:IIntf2;
  22. public
  23. constructor Create;
  24. procedure M1;
  25. // multiple delegations are forbidden
  26. property I2:IIntf2 read FObjIntf2 implements IIntf2;
  27. property I21: IIntf2 read FObjIntf2 implements IIntf2;
  28. end;
  29. { TObjIntf2 }
  30. procedure TObjIntf2.M2;
  31. begin
  32. Writeln('TObjIntf2.M2 called');
  33. end;
  34. { TObj }
  35. constructor TObj.Create;
  36. begin
  37. FObjIntf2:=TObjIntf2.Create;
  38. end;
  39. procedure TObj.M1;
  40. begin
  41. Writeln('TObj.M1 called');
  42. end;
  43. var O:TObj;
  44. i1:IIntf1;
  45. i2:IIntf2;
  46. begin
  47. O:=TObj.Create;
  48. i1:=O;
  49. //all tries are unsuccessful
  50. i2:=O as IIntf2;
  51. //(O as IIntf1).QueryInterface(IIntf2, i2);
  52. // i1.QueryInterface(IIntf2, i2);
  53. //still calls TObj1.M1
  54. i2.M2;
  55. end.