Другой вариант - использовать RTTI.Приведенный ниже код работает как обычный метод в моем классе как способ получения нового экземпляра объекта с подмножеством элементов, но поскольку элементы (вместе с самим объектом списка), вероятно, являются потомками, создавая экземпляробъект, в котором определен метод, недостаточно хорош, поскольку он должен быть того же типа, что и экземпляр.
т.е.
TParentItem = Class
End;
TParentList = Class
Items : TList<TParentItem>;
Function GetSubRange(nStart,nEnd : Integer) : TParentList;
End;
TChildItem = Class(TParentItem)
end
TChildList = Class(TParentList)
end
List := TChildList.Create;
List.LoadData;
SubList := List.GetSubRange(1,3);
Реализация, если GetSubRange будет выглядеть примерно так...
Function TParentList.GetSubRange(nStart,nEnd : Integer) : TParentList;
var
aContext: TRttiContext;
aType: TRttiType;
aInsType : TRttiInstanceType;
sDebug : String;
begin
aContext := TRttiContext.Create;
aType := aContext.GetType(self.ClassType);
aInsType := aType.AsInstance;
Result := aInsType.GetMethod('Create').Invoke(aInsType.MetaclassType,[]).AsType<TParentList>;
sDebug := Result.ClassName; // Should be TChildList
// Add the items from the list that make up the subrange.
End;
Я понимаю, что для некоторых вещей это может быть немного OTT, но в приведенном выше дизайне это работает и является другой альтернативой, хотя я ценю, это не метод класса.