Delphi.Generics types

В данном посте разбираюсь с обобщенными типами данных, руководствуясь книгой Д. Осипова “Delphi. Программирование для Windows. OS X, iOS и Android”. Цель – отработать на практике возможности обобщенных типов.

Зачем нужны обобщенные типы?

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

Допустим, он корректно работает и с другими типами данных. Раньше надо было бы его переписывать на другие типы данных, а сейчас достаточно указать в обобщенном типе данных, что тип данных в данном конкретном случае будет другой.

Где используются?

В записях

В процедурах и функциях

В объявлениях классов

В массивах

В объектах

В словарях


 

Generic types в записях

Объявили тип

Объявили переменную

Используем переменные

Пример простой и наглядный. Как видно, один и тот же тип используем по-разному. Переменной этого типа Grec1.A присвоили значение 12, а переменной Grec2.A – значение ‘hello’;
Удобно с точки зрения написания одного алгоритма под разные виды данных.


Generyc types в процедурах и функциях

В книге взят пример с функции максимума 2-х чисел. Прикол в том, что нельзя напрямую сравнивать значения обобщенных типов так как они заранее не известны. Тем не менее, для реализации функции в обобщенном виде используются специальные интерфейсы, например IComparer. Итак, для начала объявляется тип с обобщенным параметром

Далее пишется реализация данного типа

Далее, можем “повесить” вот такой обработчик на кнопку

Видим, что использовали 2 разных типа и один алгоритм. Единственное, что не очень удобно – нельзя все сделать напрямую. То есть нужен вспомогательный интерфейс – компаратор.


Generic types в классах

Создаем класс

Пишем реализацию методов

“Вешаем” обработчик на кнопку


Generic types в массивах

// На примере массива целых чисел. На форме кнопка и листбокс


Generic types в объектах

Из книги Д.Осипова, взял и реализовал небольшой пример

Результат

1


В словарях

Для тренировки создал простейшую программу на основе TDictionary<>;

2

Особенность TDictionary в том, что ключ должен быть уникальным для каждой записи иначе сгенерируется ошибка. Мне сначала показалось, что TDictionary мало чем отличается по функционалу от TStringlist, и, в принципе, в своем примере я показал очень малую, куцую часть его возможностей, но не тут то было, чуть позже, после того как я написал пост, я обнаружил очень классную статью на оф. сайте embarcadero. Там TDictionary используется по аналогии с записью. Объявляется класс с полями, который потом используется в качестве обобщенного параметра. И в поля уже пишется все, что нужно.


 

Также, относительно загадочной для меня пока остается тема компараторов. Я так понял это специальные классы для сравнения обобщенных значений. Видел в сети примеры, где люди создают собственные компараторы, видимо, для каких-то уникальных случаев.

Вот ещё момент, с которым я столкнулся. Нельзя напрямую, например, сложить X+Y, если они внутри обобщенного типа. А как это сделать, я пока не понял.

На данный момент осознал такую пользу от обобщенных типов – легкий доступ к быстрой сортировке и binarysearch в массивах. В записях – удобно то, что можно для одной записи использовать несколько разных типов без переопределения записи, в словарях – аналогично. Ну и, конечно же, одни алгоритмы для разных типов данных.

This entry was posted in Delphi, Delphi. Язык программирования, FireMonkey, Без рубрики. Bookmark the permalink.