[fpc-pascal] Interface, _AddRef, _Release, etc.

Marcos Douglas md at delfire.net
Thu Sep 15 21:59:44 CEST 2011


On Thu, Sep 15, 2011 at 12:12 PM, Felipe Monteiro de Carvalho
<felipemonteiro.carvalho at gmail.com> wrote:
> I don't understand why it would be wrong. For me it seams correct and
> similar to this example:
>
> http://wiki.lazarus.freepascal.org/How_To_Use_Interfaces_to_write_less_code

I'd like to use the same idea of link above, ie, using a real class
(and your's own methods and properties) but assign the instance of
this object, in an interface. But, like the link, if I can not use
Free method on my objects... well, I think this is strange.

What I want was: Two classes completly different but that implement
the same interface... and these classes will be instanciated using
variables with the same type.

To solve my problem, the only way is create more interfaces -- and
more code, unfortunately.
See below. 'a' and 'b' are different objects, different methods, but
they share the same methods, ie, GetInfo and SetInfo.

program p1;
{$apptype console}
{$ifdef FPC}
  {$mode objfpc}{$H+}
{$endif}
uses
  heaptrc,
  Classes,
  SysUtils;
type
  IInfo = interface
    ['{F71A4131-E0A5-48CB-B563-7BBB079D1085}']
    function GetInfo: string;
    procedure SetInfo(const AValue: string);
  end;

  IInfoA = interface(IInfo)
    ['{0E816EA4-21A5-49B3-B7E8-396E2F788E4B}']
    procedure SetName(const AValue: string);
  end;

  IInfoB = interface(IInfo)
    ['{0E816EA4-21A5-49B3-B7E8-396E2F788E4B}']
    procedure SetNumber(const AValue: Integer);
  end;

  TInfo = class(TInterfacedObject, IInfo)
  private
    FInfo: string;
  public
    function GetInfo: string;
    procedure SetInfo(const AValue: string);
  end;

  TInfoA = class(TInfo, IInfoA)
  public
    procedure SetName(const AValue: string);
  end;

  TInfoB = class(TInfo, IInfoB)
  public
    procedure SetNumber(const AValue: Integer);
  end;

  TObj = class(TObject)
    Info: IInfo;
  end;

{ TInfo }

function TInfo.GetInfo: string;
begin
  Result := FInfo;
end;

procedure TInfo.SetInfo(const AValue: string);
begin
  FInfo := AValue;
end;

{ TInfoA }

procedure TInfoA.SetName(const AValue: string);
begin
  SetInfo('InfoA :: ' + AValue);
end;

procedure TInfoB.SetNumber(const AValue: Integer);
begin
  SetInfo('InfoB :: ' + IntToStr(AValue));
end;

procedure Run;
var
  a: IInfoA;
  b: IInfoB;
  o: TObj;
begin
  a := TInfoA.Create;
  a.SetName('ZEOS');
  b := TInfoB.Create;
  b.SetNumber(99);
  o := TObj.Create;
  o.Info := a;
  writeln(o.Info.GetInfo);
  o.Info := b;
  writeln(o.Info.GetInfo);
  o.Free;
end;

begin
  Run;
end.



More information about the fpc-pascal mailing list