КИТА unofficial

Компьютерный => Программирование => Тема начата: naxellar от Январь 20, 2010, 03:07:20



Название: Generics (Delphi)
Отправлено: naxellar от Январь 20, 2010, 03:07:20
Пример:

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

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


Название: Re: Generics (Delphi)
Отправлено: Артем от Январь 20, 2010, 07:31:10
Как вариант, можно создать внутри класса какую-нибудь переменную type, отвечающую за тип, и инициализировать ее в конструкторе с параметром. А потом просто проверять, если type=1, то значит тип Integer и юзаем IntToStr, если type=2, то Rea,l и юзаем FloatToStr и т.д.


Название: Re: Generics (Delphi)
Отправлено: Sochin от Январь 20, 2010, 11:14:11
naxellar

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

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

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


Название: Re: Generics (Delphi)
Отправлено: naxellar от Январь 20, 2010, 11:50:15
Артем, компилятор не пропустит.


Название: Re: Generics (Delphi)
Отправлено: tos от Январь 20, 2010, 01:07:58
выражение "специализация шаблонов" о чём-то говорит?


Название: Re: Generics (Delphi)
Отправлено: Sochin от Январь 20, 2010, 01:34:40
tos

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


Название: Re: Generics (Delphi)
Отправлено: Артем от Январь 20, 2010, 04:13:06
Артем, компилятор не пропустит.
С чего бы это ? В Delphi, честно говоря, я не пробовал, но на С++ все работает. Помню в лабе по ООП так делал. Правда этот способ уже не будет соответствовать принципам обобщенного программирования)) Так что идея с наследниками, которую предложил Sochin, имхо, самая нормальная.


Название: Re: Generics (Delphi)
Отправлено: naxellar от Январь 20, 2010, 04:53:37
tos, не говорит, поищу на эту тему.
Sochin, покопаю пункт 2.

Артем, Для переменной "типа" T не работает ни IntToStr, но StrToFloat.


Название: Re: Generics (Delphi)
Отправлено: tos от Январь 20, 2010, 05:18:18
если .net то у него ж все типы - объекты, и у всех есть .toString()


Название: Re: Generics (Delphi)
Отправлено: naxellar от Январь 20, 2010, 05:24:47
tos, нет-нет, обычный Delphi.


Название: Re: Generics (Delphi)
Отправлено: naxellar от Январь 22, 2010, 03:42:58
Можно потребовать чтобы T имел некий базовый класс или поддерживал некий интерфейс
Почитал про интерфейсы, не понял, чем они могут тут помочь.


Название: Re: Generics (Delphi)
Отправлено: tos от Январь 22, 2010, 11:44:51
вызываем объявленный у интерфейса toString() переопределённый у наследников.
ну только зачем тут шаблоны тогда?


Название: Re: Generics (Delphi)
Отправлено: naxellar от Январь 22, 2010, 04:04:18
tos, вообщем получается, что generics мне тут не нужны. Жаль, с ними было бы красиво.


Название: Re: Generics (Delphi)
Отправлено: tos от Январь 22, 2010, 07:56:33
красота - это когда новое решение является куда более простым, понятным и уместным.
тут же - увы=)