Соберите объекты с различными типами - PullRequest
1 голос
/ 30 июля 2009

Дан универсальный тип

TMyClass <T> = class
  ...
end;

есть ли способ соединить несколько экземпляров (экземпляры разных типов) вместе, как

FList : TList <TMyClass>;
FList.Add (TMyClass <Integer>.Create);
FList.Add (TMyClass <String>.Create);

или

FArray : array [0..1] of TMyClass;
FArray [0] := TMyClass <Integer>.Create;
FArray [1] := TMyClass <String>.Create;

Я знаю, что этот код не компилируется. Но возможно ли достичь чего-то подобного?

Ответы [ 2 ]

3 голосов
/ 30 июля 2009

Вы можете сделать это, если создадите FList с предком TMyClass.

Обобщения не являются наследованием, поэтому TMyClass не является предком TMyClass.

TMyAbstractClass = class
TMyClass <T> = class (TMyAbstractClass)
  ...
end;

FList : TList <TMyAbstractClass>;
FList.Add (TMyClass <Integer>.Create);
FList.Add (TMyClass <String>.Create);

FArray : array [0..1] of TMyAbstractClass;
FArray [0] := TMyClass <Integer>.Create;
FArray [1] := TMyClass <String>.Create;
1 голос
/ 30 июля 2009

Один из вариантов - иметь неуниверсальный базовый класс для TMyClass, содержащий все биты, которые не относятся к T in. Затем вы создаете TList<TMyNonGenericBaseClass> и добавляете к нему экземпляры. Конечно, вы не знаете, что такое полный конкретный тип, когда вы получаете их снова, но это может не быть проблемой для вас.

...