Я пытался определить общий, наследуемый класс TSingleton. Вот что я имел в прогрессе:Может ли общий класс Delphi спуститься с аргумента класса?
TSingleton<RealClass, InheritsFrom : class> = class(InheritsFrom)
strict private
class var FInstance : RealClass;
protected
procedure InstanceInitialization;virtual;
public
destructor Destroy; override;
class procedure Create; reintroduce;
class function Instance : RealClass;
class procedure InstanceFree;
end;
Цель состояла в том, чтобы иметь возможность «вставить» одноплодную шаблон в дереве наследования. так что вместо того, чтобы объявить что-то вроде этого:
TMySingletonComponent = class(TComponent)
end;
И нужно реализовать одноплодный шаблон там, я бы объявить что-то вроде этого:
TMyGenericSingletonComponent = class(TSingleton<TMyGenericSingletonComponent,TComponent>)
end;
К сожалению, это не будет работать. Я получаю следующее сообщение об ошибке (в D2010):
TSingleton<RealClass, InheritsFrom : class> = class(InheritsFrom) ///E2021 Class type required
Теперь мне было интересно, что эта работа в Delphi XE? Есть ли какой-нибудь «чистый хак», который я мог бы использовать, чтобы сделать эту работу в D2010? Есть ли какие-то фундаментальные причины, почему это не может работать?
В других кругах, о чем вы спрашиваете, известен как * любопытно повторяющийся шаблон шаблона *, но generics не являются шаблонами. –