В RTL / VCL нет интерфейса, который бы делал то, что вы хотите (предоставьте тот же интерфейс, что и TStrings
). Если вы хотите использовать такую вещь, вам придется изобретать ее самостоятельно.
Вы бы реализовали его с помощью обёртки, подобной этой:
type
IStrings = interface
function Add(const S: string): Integer;
end;
TIStrings = class(TInterfacedObject, IStrings)
private
FStrings: TStrings;
public
constructor Create(Strings: TStrings);
destructor Destroy; override;
function Add(const S: string): Integer;
end;
constructor TIStrings.Create(Strings: TStrings);
begin
inherited Create;
FStrings := Strings;
end;
destructor TIStrings.Destroy;
begin
FStrings.Free; // don't use FreeAndNil because Nick might see this code ;-)
inherited;
end;
function TIStrings.Add(const S: string): Integer;
begin
Result := FStrings.Add(S);
end;
Естественно, вы бы завернули остальную часть интерфейса TStrings
в настоящий класс. Сделайте это с помощью класса-обёртки, как этот, чтобы вы могли обернуть любой тип TStrings
, просто имея доступ к его экземпляру.
Используйте это так:
var
MyList : IStrings;
....
MyList := TIStrings.Create(TStringList.Create);
Вы можете предпочесть добавить вспомогательную функцию, которая фактически выполняет грязную работу по вызову TIStrings.Create
.
Обратите внимание, что проблема может быть в жизни Вы можете захотеть вариант этой оболочки, который не берет на себя управление временем жизни базового экземпляра TStrings
. Это может быть организовано с помощью параметра конструктора TIStrings
.
Сам, я думаю, что это интересный мысленный эксперимент, но не очень разумный подход. Класс TStrings
является абстрактным классом, который обладает практически всеми преимуществами интерфейсов. Я не вижу реальных недостатков в использовании его как есть.