前回の続き。
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!