КИТА unofficial
Апрель 20, 2024, 08:17:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: [1]   Вниз
  Печать  
Автор Тема: Generics (Delphi)  (Прочитано 14109 раз)
0 Пользователей и 1 Гость смотрят эту тему.
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline Offline

Пол: Мужской
Сообщений: 5015

Главный флудер


« : Январь 20, 2010, 03:07:20 »

Пример:

Код:
type
    TClassExample<T> = class
        FValue: T;
    end;

Как мне внутри класса работать с FValue, в зависимости от типа? Например, преобразовать FValue в строку (Для Real и Integer - разные функции: FloatToStr, IntToStr).
Записан
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #1 : Январь 20, 2010, 07:31:10 »

Как вариант, можно создать внутри класса какую-нибудь переменную type, отвечающую за тип, и инициализировать ее в конструкторе с параметром. А потом просто проверять, если type=1, то значит тип Integer и юзаем IntToStr, если type=2, то Rea,l и юзаем FloatToStr и т.д.
Записан
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #2 : Январь 20, 2010, 11:14:11 »

naxellar

Дельфи-дженерики о_0

Идея обобщенного программирования состоит в том чтобы поиметь независимые от конкретного типа абстракции данных или процедур, т.е. обобщенный код на то и обобщенный чтобы не зависеть от типа. Иначе говоря: по хорошему либо дженерики либо зависимость от типа.

Что можно сделать выбирай на вкус:
1. Сотворить наследников для TClassExample<Real> и TClassExample<Integer> и работать «в зависимости от типа» с полем FValue конкретного типа. Аминь.
2. Потребовать ограничений для типа параметра. Можно потребовать чтобы T имел некий базовый класс или поддерживал некий интерфейс. В таком разе поле FValue получит нужные члены уже в обобщенном дженерике.
3. Прости господи, заюзать какие-нибудь хитроумные приведения типов прямо в TClassExample<T>. Для отважных.
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline Offline

Пол: Мужской
Сообщений: 5015

Главный флудер


« Ответ #3 : Январь 20, 2010, 11:50:15 »

Артем, компилятор не пропустит.
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #4 : Январь 20, 2010, 01:07:58 »

выражение "специализация шаблонов" о чём-то говорит?
Записан
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #5 : Январь 20, 2010, 01:34:40 »

tos

В отличие от шаблонов С++, .Net generics(как я понимаю, речь именно о них) не поддерживают полной либо частичной специализации.
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #6 : Январь 20, 2010, 04:13:06 »

Артем, компилятор не пропустит.
С чего бы это ? В Delphi, честно говоря, я не пробовал, но на С++ все работает. Помню в лабе по ООП так делал. Правда этот способ уже не будет соответствовать принципам обобщенного программирования)) Так что идея с наследниками, которую предложил Sochin, имхо, самая нормальная.
« Последнее редактирование: Январь 20, 2010, 04:26:55 от Артем » Записан
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline Offline

Пол: Мужской
Сообщений: 5015

Главный флудер


« Ответ #7 : Январь 20, 2010, 04:53:37 »

tos, не говорит, поищу на эту тему.
Sochin, покопаю пункт 2.

Артем, Для переменной "типа" T не работает ни IntToStr, но StrToFloat.
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #8 : Январь 20, 2010, 05:18:18 »

если .net то у него ж все типы - объекты, и у всех есть .toString()
Записан
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline Offline

Пол: Мужской
Сообщений: 5015

Главный флудер


« Ответ #9 : Январь 20, 2010, 05:24:47 »

tos, нет-нет, обычный Delphi.
Записан
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline Offline

Пол: Мужской
Сообщений: 5015

Главный флудер


« Ответ #10 : Январь 22, 2010, 03:42:58 »

Можно потребовать чтобы T имел некий базовый класс или поддерживал некий интерфейс
Почитал про интерфейсы, не понял, чем они могут тут помочь.
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #11 : Январь 22, 2010, 11:44:51 »

вызываем объявленный у интерфейса toString() переопределённый у наследников.
ну только зачем тут шаблоны тогда?
Записан
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline Offline

Пол: Мужской
Сообщений: 5015

Главный флудер


« Ответ #12 : Январь 22, 2010, 04:04:18 »

tos, вообщем получается, что generics мне тут не нужны. Жаль, с ними было бы красиво.
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #13 : Январь 22, 2010, 07:56:33 »

красота - это когда новое решение является куда более простым, понятным и уместным.
тут же - увы=)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.036 секунд. Запросов: 29.