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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 18.07.2015, 22:47   #21
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я, как консерватор, не парился бы по этому поводу.
Правильный ответ на эту реплику: "Флудерам слова не давали". Хотел было сразу написать, но сдержался. Как показала практика, зря.

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Мне просто нужен (был) конструктор переменного типа, который можно бы было юзать без приведения типов. Оказалось, что не всё так просто.
Так а чем обощенная функция не устраивает-то?

Другой способ организации фабрики класса -- объявление виртуального конструктора (который и есть фабрика класса по сути) и описание массива классов:
Код:
type
  TXmlOptionClass = class of TXmlOption;
  TXmlOptionClasses = array[TOptionKind] of TXmlOptionClass;

var
  XmlOpitionClasses: TXmlOptionClasses = (TXmlOptionOrdinal, TXmlOptionFloat,
    TXmlOptionPoint, TXmlOptionRect, TXmlOptionString, TXmlOptionIntList);

function TAbstractOption.NewChildOption(const AKind: TOptionKind;
  const AName: string = ''): TXmlOption;
begin
  Result := XmlOptionClasses[AKind].Create(AName);
end;
Это работает во всех известных мне версиях Delphi.
Vapaamies вне форума
Старый 18.07.2015, 23:59   #22
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Код:
Result := XmlOptionClasses[AKind].Create(AName);
До такого я не додумался. Спасибо.
Жаль, что не в тему - я полез в обобщённые типы, чтобы научиться с ними работать. До этого меня и старые варианты (с приведением типов) устраивали. При использовании твоего кода тоже понадобится приведение типа результата к типу переменной, в которую функция отдаёт значение.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 19.07.2015, 00:19   #23
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
При использовании твоего кода тоже понадобится приведение типа результата к типу переменной, в которую функция отдаёт значение.
Если цель -- избавление именно от приведения типа, можно и совместить:
Код:
function TAbstractOption.NewChildOption<T>(const AKind: TOptionKind;
  const AName: string = ''): T;
begin
  Result := T(XmlOptionClasses[AKind].Create(AName));
end;
Vapaamies вне форума
Старый 19.07.2015, 00:24   #24
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

похоже, то, что надо.
в понедельник приду на работу - попробую.
спасиба.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 20.07.2015, 07:30   #25
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Это метод-процедура, а мне нада функцию. И не спрашивать, почему
А метод-процедуру в функцию не обернуть конечно? И не спрашивать почему?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума
Старый 21.07.2015, 10:35   #26
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Если цель -- избавление именно от приведения типа, можно и совместить:
Код:
function TAbstractOption.NewChildOption<T>(const AKind: TOptionKind;
  const AName: string = ''): T;
begin
  Result := T(XmlOptionClasses[AKind].Create(AName));
end;
Вполне справедливый еррор. Преобразования типов в run-time ещё, видать, не придумали. Естественно, на этапе компайлинга неизвестно, к чему привести указатель, т.к. тип приведения заранее неизвестен жэж.
Изображения
Тип файла: jpg 280524.jpg (25.5 Кб, 114 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 21.07.2015, 12:37   #27
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Вполне справедливый еррор. Преобразования типов в run-time ещё, видать, не придумали. Естественно, на этапе компайлинга неизвестно, к чему привести указатель, т.к. тип приведения заранее неизвестен жэж.
Тогда это не обобщения, а черт знает что. Код обязан компилироваться, поскольку это небезопасное приведение -- просто указатель к указателю. Можешь еще через as попробовать ради прикола. Преобразование типов в run-time, которое "не придумали" -- это as.

А вообще, я все выходные думал над этим кодом и не понял смысла обобщаемой операции. В обобщенном программировании это известная проблема курицы и яйца. Поскольку в Delphi нет вывода типов, передача имени типа при раскрытии обобщения не избавляет от описания переменной с явным указанием типа, что сводит на нет все преимущества обобщения. А если тип переменной задается явно, зачем вообще городить обобщения, не проще ли описать простое создание экземпляра конкретного типа? По коду даже короче будет.
Код:
var
  T: TXmlOptionString;
begin
  T := TXmlOptionString.Create(...);
end;
Если же речь о пакетной обработке или помещении в контейнер, там конкретный тип значения не имеет: работа ведется с общим типом-предком, в котором объявлен виртуальный конструктор, поскольку для создания и уничтожения объектов больше ничего знать не надо.

И наконец, с точки зрения компиляции, если бы этот код комплировался, он бы раскрывал обобщение в каждой точке вызова, фактически вставляя тело функции в каждом месте вызова. Догадываюсь, что на размер сейчас никто не смотрит, но при полном отсутствии выигрыша от обобщения это просто раздувание кода. Предполагал, что Delphi не умеет группировать сходные раскрытия обобщений для экономии кода, а оказалось, что этот код он вообще не компилирует.
Vapaamies вне форума
Старый 21.07.2015, 12:45   #28
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Тогда это не обобщения, а черт знает что. Код обязан компилироваться, поскольку это небезопасное приведение -- просто указатель к указателю.
Вот тут я вас обломаю. <T> - обобщение некого класса, через абстрактное T, T - просто некий существующий класс.

В вашем коде Result компилятор пытаться привести к некому классу T которого не существует в природе, потому что на тот момент <T> уже стало TMyClass

Правильно:
Код:
procedure name<T>(...):<T>
begin
  REsult := <T>(...Crete(self));
end;
Но такое IDE не проглотит.
Есть абстрактные классы, а вот абстрактных результатов у функции быть не может. Delphi типизирован, это вам не JavaScript где return это и int, string, bool, float, double и object одновременно.
Абстрактный класс просто упрощает некоторую реализацию класса операций над неким типом данных, на пример раньше приходилось самому писать TMyIntegerList, теперь это делает delphi за нас в виде TList<Integer>.

Последний раз редактировалось Человек_Борща; 21.07.2015 в 12:56.
Человек_Борща вне форума
Старый 21.07.2015, 12:46   #29
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Короче, я думаю забить на этот подход болт, так как действительно во многих частных случаях он не имеет симсыла. Заюзать я его хотел только с целью выкинуть приведение типов и неизменность кода конструктора при добавлении новых потомков TXmlOption.

Вобщем, дануегонах, других задач - мешок. Столько времени просрал, жалко.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 21.07.2015, 13:03   #30
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Хочу поковыряться в сабже. Какая у вас версия Делфи (или кого там)? А то моя не поддерживает эту фичу.
ResourceSpace вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать из числа типа real число типа integer? gylayko Помощь студентам 6 15.09.2012 11:41
Возможно ли в массив типа char записать первым элементом значение переменной типа float? Green Gin Общие вопросы C/C++ 2 05.12.2011 01:50
Каким образом сохранить цвет. Типа в переменную типа TColor ? serres C++ Builder 5 07.12.2010 16:19
С++ (конструктор, деструктор, копирующий конструктор) Jane-sad Помощь студентам 2 01.10.2010 10:01
Запись числа типа инт в ячейку двумерного массива типа char AxenicX Помощь студентам 1 25.09.2009 00:35