Это возможно. Создайте интерфейс, который предоставляет нужные методы / объекты:
type
IStringList = interface
procedure Add(const s: string); // etc.
property StringList: TStringList read GetStringList; // etc.
end;
Реализуйте интерфейс и сделайте так, чтобы он действительно TStringList
:
type
TStringListImpl = class(TInterfacedObject, IStringList)
private
FStringList: TStringList; // create in constructor, destroy in destructor
// implementation etc.
end;
Затем выполните запись:
type
TStringListRecord = record
private
FImpl: IStringList;
function GetImpl: IStringList; // creates TStringListImpl if FImpl is nil
// returns value of FImpl otherwise
public
procedure Add(const s: string); // forward to GetImpl.Add
property StringList: TStringList read GetStringList; // forward to
// GetImpl.StringList
// etc.
end;
Тот факт, что внутри записи есть интерфейс, означает, что компилятор будет обрабатывать подсчет ссылок автоматически, вызывая _AddRef и _Release, когда копии создаются и уничтожаются, поэтому управление временем жизни происходит автоматически. Это работает для объектов, которые никогда не будут содержать ссылку на себя (создание цикла) - для подсчета ссылок требуются различные приемы, чтобы преодолеть циклы в графе ссылок.