Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2014, 04:59   #1
_Freak_
Пользователь
 
Регистрация: 26.03.2013
Сообщений: 25
По умолчанию Шаблоны

Всем доброго времени суток. Есть ли способ скормить компилятору Delphi XE вот такую конструкцию:
Код:
type
  TSingleton<T: class, constructor> = class abstract
  private
    class var fInstance: T;
  public
    class function Instance(): T;
  end;

  TMyClass = class(TSingleton<TMyClass>)
  public
    constructor Create();
  end;
Если конкретно, то ругается на то, что у TMyClass нет открытого крнструктора без параметров и/или его зовут не Create. Может есть у кого какие идеи?

Последний раз редактировалось _Freak_; 09.01.2014 в 05:06.
_Freak_ вне форума Ответить с цитированием
Старый 09.01.2014, 11:06   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Что это за объявление?
Код:
 TSingleton<T: class, constructor> = class abstract
Самому интересно, что на это не ругается.

Цитата:
сли конкретно, то ругается на то, что у TMyClass нет открытого крнструктора без параметров и/или его зовут не Create. Может есть у кого какие идеи?
Создайте в public секции конструктор и сделайте его виртуальным. Все.

Далее, явно наследуйте TObject, иначе компилятор сделает это за вас в любом случае.
Человек_Борща вне форума Ответить с цитированием
Старый 09.01.2014, 13:16   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Человек_Борща, полагаю, что это ограничение на параметр типа - только определённые сущности могут быть использованы в данном обобщении (на манер сишарпа думаю). Вот даже нашёл http://docwiki.embarcadero.com/RADSt...ts_in_Generics
Ну а у меня вопрос такой к автору -
TMyClass = class(TSingleton<TMyClass>)
Чем продиктовано это указание ? Чисто логически - непонятная рекурсия.

Последний раз редактировалось phomm; 09.01.2014 в 13:48.
phomm вне форума Ответить с цитированием
Старый 10.01.2014, 01:25   #4
_Freak_
Пользователь
 
Регистрация: 26.03.2013
Сообщений: 25
По умолчанию

Всё правильно, это ограничение + гарантии для комплятора(class означает, что типом может быть только класс, а constructor говорит компилятору о том, что у этого класса есть конструктор без параметров и объявленный c public доступом. Как видите, все условия соблюдены.

Самое интересное, что вот так компилятор прожуёт:
Код:
type
  TMyClass1 = class
  public
    constructor Create();
  end;

  TMyClass2 = class
  private
    fSingleton: TSingleton<TMyClass1>;
  public
    constructor Create();
  end;
TSingleton<T> - шаблон класса, который реализует паттерн "одиночка". Просто в моём проекте используется несколько таких одиночек, и описывать для каждого из них статическую функцию Instance и статическую переменную член fInstance как-то не камильфо, поэтому хотелось бы запихнуть всё это в один шаблон. К тому же это повысило бы читабельность интерфейса классов.
_Freak_ вне форума Ответить с цитированием
Старый 10.01.2014, 01:42   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

зачем синглтону публичный конструктор?
чтото не то в консерватории
eval вне форума Ответить с цитированием
Старый 10.01.2014, 01:45   #6
_Freak_
Пользователь
 
Регистрация: 26.03.2013
Сообщений: 25
По умолчанию

Замечено верно, но это претензии к компилятору
Как писал в своём посте выше, constructor накладывает ограничения: конструктор класса должен быть открытым и звать его должны Create
_Freak_ вне форума Ответить с цитированием
Старый 10.01.2014, 02:05   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Ну а у меня вопрос такой к автору -
TMyClass = class(TSingleton<TMyClass>)
Чем продиктовано это указание ? Чисто логически - непонятная рекурсия.
Я так же делал при реализации дерева. Очень удобно)

ТС, в какой IDE программируете? С обобщенными даже в XE2 были большие проблемы)
Человек_Борща вне форума Ответить с цитированием
Старый 10.01.2014, 07:54   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Ну, настолько плотно с обощениями не работал, показалось странным.
Также предложу работать с более поздней версией дельфи(у автора, я так понял, что ХЕ), где косяк (если он от дельфи) может быть уже пофикшен.
Также предлагаю рассмотреть вот это:
http://ins911.blogspot.ru/2008_12_01_archive.html

Последний раз редактировалось phomm; 10.01.2014 в 08:38.
phomm вне форума Ответить с цитированием
Старый 10.01.2014, 09:40   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Замечено верно, но это претензии к компилятору
Как писал в своём посте выше, constructor накладывает ограничения: конструктор класса должен быть открытым и звать его должны Create
это все ерунда, если вы делаете синглтон, то его и надо делать, иначе профита от вашего обобщения ноль, простое наследование делает тоже самое, и никаких заморочек.

Цитата:
Также предлагаю рассмотреть вот это:
все правильно в старых версиях переопределяли NewInstance для трусинглтона, сейчас не знаю, может появились новые подходы в связи с расширением языка..
eval вне форума Ответить с цитированием
Старый 10.01.2014, 14:02   #10
_Freak_
Пользователь
 
Регистрация: 26.03.2013
Сообщений: 25
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Ну, настолько плотно с обощениями не работал, показалось странным.
Также предложу работать с более поздней версией дельфи(у автора, я так понял, что ХЕ), где косяк (если он от дельфи) может быть уже пофикшен.
Также предлагаю рассмотреть вот это:
http://ins911.blogspot.ru/2008_12_01_archive.html
Спасибо за ссылку, но с первого взгляда на код, становится понятно: будут очень большие накладные расходы на получение экземрляра, так как нам в рантайме придётся перебрать весь список в поисках нашего класса. Хотя как вариант имеет право на жизнь, но хотелось бы этого избежать. У меня нет под рукой XE5, но.. у кого она есть попроуйте скомпилировать вот это:
Код:
program SingletonTest;

{$APPTYPE CONSOLE}

type


  TSingleton<T: class, constructor> = class abstract
  strict private
    class var fInstance: T;
  public
    class function Instance(): T;
  end;

  TMySingleton = class(TSingleton<TMySingleton>)
  public
    constructor Create();
  end;


{ TSingleton<> }

class function TSingleton<T>.Instance(): T;
begin
  if not Assigned(fInstance) then
    fInstance := T.Create();

  Result := fInstance;
end;


{ TMySingleton }

constructor TMySingleton.Create();
begin
  inherited Create();
end;


{ Program entry point }

var
  myclass: TMySingleton;
begin
  myclass := TMySingleton.Instance();
end.

Последний раз редактировалось _Freak_; 10.01.2014 в 15:04.
_Freak_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шаблоны с++ ftg Помощь студентам 0 25.12.2013 23:46
Шаблоны К_С_Ю Помощь студентам 1 23.04.2012 22:05
Шаблоны Romario92 C++ Builder 2 18.04.2011 19:46
Шаблоны С++ Secc Помощь студентам 4 27.12.2009 17:35
Шаблоны C++ Viamy Помощь студентам 0 27.12.2009 16:10