![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
omickron |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 12.2.2009 Репутация: нет Всего: 1 |
Пытаюсь разобраться с дженериками в Delphi XE2.
Не понимаю, чем отличается TMyClass<T> = class(TObject) от TMyClass<T: class> = class(TObject) Хочу сделать следующее:
Порядок использования:
Суть в том, чтобы перед началом работы зарегистрировать в фабрике всех наследников TMyClass, а потом создавать их, зная только имя. Но не пойму, чем отличается TMyClass<T> от TMyClass<T: class> Если использовать второй вариант, то ругается здесь: TMyFactory.RegisterType(TMyClass1); //[DCC Error] Incompatible types: 'TMyClass' and 'class of TMyClass1' Т.е. хочет, чтоб я передал TMyClass1.Create. А я не хочу создавать объект сейчас. Я хочу просто зарегистрировать тип. Как нужно описать тип TFactory? |
||||
|
|||||
Illusion Dolphin |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
В первом случае T - любой тип, во втором T должен быть классом. TFactory<TMyClass> - значит что T это объекты типа TMyClass. Чтобы туда добавлять типы объектов, надо сделать:
-------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||
|
|||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
не очень понятно зачем тебе тут дженерики. с этой задачей метаклассы отлично справлялись задолго до них. разве что для того чтобы возвращать тип, который уже не нужно приводить
-------------------- Обижено школьников: 8 |
|||
|
||||
omickron |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 12.2.2009 Репутация: нет Всего: 1 |
bems, Вы совершенно правы. У меня уже есть функционал, который работает, но приходится делать приведение типов.
Я перешёл на XE2 и хочу переписать это с использованием дженериков. Если это, конечно, возможно Illusion Dolphin, скажите, а что означает такая конструкция: TMyClass<T: constructor> = class(TObject) Если я правильно понимаю, означает ли это, что тип, передаваемый в T, должен иметь конструктор без параметров? И тогда можно будет в коде написать что-то вроде Result := T.Create; ? Как бы указать в параметризации, что я хочу параметризовать класс не объектом, а его типом: не TMyClass, а class of TMyClass. Если я укажу TFactory<T: class>, это будет означать, что я должен параметризовать его типом TMyClass. А мне нужно параметризовать его типом class of TMyClass. Это сообщение отредактировал(а) omickron - 29.12.2012, 23:47 |
|||
|
||||
Illusion Dolphin |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Точно так:
Вот пример реализации того что в первом посте:
P.S. Практического смысла тут не вижу. -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||||
|
|||||||
omickron |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 12.2.2009 Репутация: нет Всего: 1 |
Illusion Dolphin, смысл в том, чтобы сделать общую фабрику, которая будет оперировать типами классов (class of TMyClass). TFactory<T> = class(TObject).
А потом TMyClassType = class of TMyClass и TMyFactory = class(TFactory<TMyClassType>). И TMyFactory будет отдавать зарегистрированные типы по имени. Вот есть общая фабрика TFactory<T> и у неё есть метод GetElement(Name: string): T; и её наследник: TMyClassFactory = class(TFactory<TMyClass>) Что будет возвращать GetElement? TMyClass или TMyClass.Create? Созданный объект или тип объекта? * Если указать TFactory<T>, T - любой тип. * Если указать TFactory<T: class>, в T можно передавать только классы. * Если указать TFactory<T: class, constructor>, в T можно передавать классы, у которых есть конструктор без параметров. Что во всех этих случаях будет возвращать GetElement: T? И что нужно указать вместе с T, чтобы передавать не TMyClass, а TMyClassType? |
|||
|
||||
Illusion Dolphin |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
при:
GetElement возвращает объекты типа TMyClass (т.е. созданные объекты)
? Я не понимаю, в чём проблема. -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||||
|
|||||||
omickron |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 12.2.2009 Репутация: нет Всего: 1 |
А как объявить TFactory<?>, чтоб эта общая фабрика знала, что она будет параметризована типом объекта? Например, чтоб можно было сделать такой метод:
Осталось понять только это ![]() |
||||
|
|||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Если я правильно понял, то тут RTTI надо:
P.S. Сделал хранилище типом TDictionary<string, TClass> Это сообщение отредактировал(а) Illusion Dolphin - 30.12.2012, 11:49 -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
omickron |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 12.2.2009 Репутация: нет Всего: 1 |
Ага. Спасибо. Изучу этот аспект. Возможно, то, что надо
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |