naxellar
Главный флудер
Проректор
Карма: +101/-52
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
Пол:
Сообщений: 1107
|
|
« Ответ #1 : Январь 20, 2010, 07:31:10 » |
|
Как вариант, можно создать внутри класса какую-нибудь переменную type, отвечающую за тип, и инициализировать ее в конструкторе с параметром. А потом просто проверять, если type=1, то значит тип Integer и юзаем IntToStr, если type=2, то Rea,l и юзаем FloatToStr и т.д.
|
|
|
Записан
|
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
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
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #3 : Январь 20, 2010, 11:50:15 » |
|
Артем, компилятор не пропустит.
|
|
|
Записан
|
|
|
|
tos
|
|
« Ответ #4 : Январь 20, 2010, 01:07:58 » |
|
выражение "специализация шаблонов" о чём-то говорит?
|
|
|
Записан
|
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #5 : Январь 20, 2010, 01:34:40 » |
|
tos
В отличие от шаблонов С++, .Net generics(как я понимаю, речь именно о них) не поддерживают полной либо частичной специализации.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #6 : Январь 20, 2010, 04:13:06 » |
|
Артем, компилятор не пропустит. С чего бы это ? В Delphi, честно говоря, я не пробовал, но на С++ все работает. Помню в лабе по ООП так делал. Правда этот способ уже не будет соответствовать принципам обобщенного программирования)) Так что идея с наследниками, которую предложил Sochin, имхо, самая нормальная.
|
|
« Последнее редактирование: Январь 20, 2010, 04:26:55 от Артем »
|
Записан
|
|
|
|
naxellar
Главный флудер
Проректор
Карма: +101/-52
Offline
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #7 : Январь 20, 2010, 04:53:37 » |
|
tos, не говорит, поищу на эту тему. Sochin, покопаю пункт 2.
Артем, Для переменной "типа" T не работает ни IntToStr, но StrToFloat.
|
|
|
Записан
|
|
|
|
tos
|
|
« Ответ #8 : Январь 20, 2010, 05:18:18 » |
|
если .net то у него ж все типы - объекты, и у всех есть .toString()
|
|
|
Записан
|
|
|
|
naxellar
Главный флудер
Проректор
Карма: +101/-52
Offline
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #9 : Январь 20, 2010, 05:24:47 » |
|
tos, нет-нет, обычный Delphi.
|
|
|
Записан
|
|
|
|
naxellar
Главный флудер
Проректор
Карма: +101/-52
Offline
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #10 : Январь 22, 2010, 03:42:58 » |
|
Можно потребовать чтобы T имел некий базовый класс или поддерживал некий интерфейс Почитал про интерфейсы, не понял, чем они могут тут помочь.
|
|
|
Записан
|
|
|
|
tos
|
|
« Ответ #11 : Январь 22, 2010, 11:44:51 » |
|
вызываем объявленный у интерфейса toString() переопределённый у наследников. ну только зачем тут шаблоны тогда?
|
|
|
Записан
|
|
|
|
naxellar
Главный флудер
Проректор
Карма: +101/-52
Offline
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #12 : Январь 22, 2010, 04:04:18 » |
|
tos, вообщем получается, что generics мне тут не нужны. Жаль, с ними было бы красиво.
|
|
|
Записан
|
|
|
|
tos
|
|
« Ответ #13 : Январь 22, 2010, 07:56:33 » |
|
красота - это когда новое решение является куда более простым, понятным и уместным. тут же - увы=)
|
|
|
Записан
|
|
|
|
|