Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
function(....): reference to function(...): reference to ...?Cache := TCache<Integer, Double>.Create;
Cache: ICache
type
// Интерфейсная оболочка над объектом (используется, если нужно простой объект превратить в интерфейс)
IInterfacedContainer<T> = interface
function InnerObject: T;
function DetachInnerObject: T;
end;
TInterfacedContainer<T: class> = class(TInterfacedObject, IInterfacedContainer<T>)
private
FInnerObject: T;
public
constructor Create(const aObject: T);
destructor Destroy; override;
function InnerObject: T;
function DetachInnerObject: T;
end;
{ TInterfacedContainer<T> }
constructor TInterfacedContainer<T>.Create(const aObject: T);
begin
inherited Create;
FInnerObject := aObject;
end;
destructor TInterfacedContainer<T>.Destroy;
begin
FInnerObject.Free;
inherited;
end;
function TInterfacedContainer<T>.DetachInnerObject: T;
begin
Result := FInnerObject;
FInnerObject := nil;
end;
function TInterfacedContainer<T>.InnerObject: T;
begin
Result := FInnerObject;
end;
{Пример использования}
procedure Test;
var
vCont: IInterfacedContainer<TSomeObj>;
begin
vCont := TInterfacedContainer<TSomeObj>.Create(TSomeObj.Create);
with vCont.InnerObject do
{do something with TSomeObj}
end;
{ После выхода из метода контейнер автоматически удалится вместе с объектом, который содержится внутри контейнера }
Использование замыканий и функций высших порядков в Delphi