読者です 読者をやめる 読者になる 読者になる

TInterfacedObjectとinterfaceを使ってオブジェクトを自動的に開放する(2)

前回の続き。
TInterfacedObjectとinterfaceを使ってオブジェクトを自動的に開放する - 偏った言語信者の垂れ流し
自動的に開放されるオブジェクトでプロパティを使ってみる。

interfaced_object.dpr

program interfaced_object_property;

{$APPTYPE CONSOLE}

type
  IFoo = interface
    procedure Say;
  end;

  TFoo = class(TInterfacedObject, IFoo)
  private
    FValue: String;
  public
    procedure Say;
    property Value: String read FValue write FValue;
  end;

procedure TFoo.Say;
begin
  Writeln(FValue);
end;

var
  // TFooだと明示的な開放が必要
  // IFooだと参照カウントで自動的に開放
  Foo: IFoo;
  // TFooとしてアクセスするための変数
  AFoo: TFoo;

begin
  // 終了時にメモリリークをレポートする
  ReportMemoryLeaksOnShutdown := True;
  Foo := TFoo.Create;
  // TFooにキャストする
  AFoo := Foo as TFoo;
  AFoo.Value := 'Hello, world!';
  AFoo.Say;
  // Freeを呼ばない
end.

as演算子でIFooにキャストしてアクセスするだけ。
このコードではIFoo型の変数にCreateしたインスタンスを代入しているが、TFoo型に代入してIFooにキャストするのでも可。
このやり方で開放はされるけど、これだけではFreeを呼ぶのとあんまり変わらない。変数のスコープをうまく利用すればいいのかな。

実行結果

>dcc32 interfaced_object_property.dpr
>interfaced_object_property.exe
Hello, world!