Может ли универсальный класс Delphi наследовать от своего аргумента класса? - PullRequest
4 голосов
/ 22 октября 2010

Я пытался определить общий наследуемый класс TSingleton. Вот что я делал:

  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? Есть ли фундаментальные причины, по которым это не может работать?

Ответы [ 3 ]

5 голосов
/ 22 октября 2010

По замыслу вы не можете создать универсальный класс, производный от одного из его аргументов типа.

3 голосов
/ 22 октября 2010

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

2 голосов
/ 22 октября 2010

Что вы хотите получить?

ИМХО, синглтоны - это зло.Они были введены из-за плохого ООП-дизайна C ++ (насколько я помню, для доступа к потокам ввода / вывода в консольных приложениях).И они, как правило, похожи на ад, чтобы поддерживать их.

Вы всегда можете жить без них.Это определенно не «классический Delphi» способ программирования, потому что Delphi не страдает от проблем C ++, о которых я упоминал.

Некоторые Java-проекты (ab) используют синглтон.Поговорите с ним, и вы поймете, что я имею в виду.

Используйте свойство общего класса с геттером, инициализируйте экземпляр, если соответствующее поле все еще равно нулю, или напрямую верните указатель наэкземпляр, если он уже был создан.У вас будет одноэлементная функция с хорошей производительностью, хорошим кодом, хорошей практикой ООП (без «глобального» класса) и возможностью запускать класс без каких-либо одноэлементных функций, если вам не понадобится эта функция позже (для тестированияцель, например).

...