<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=189695&amp;view=findpost&amp;p=1593965</guid>
        <pubDate>Thu, 07 Jun 2007 18:25:26 +0000</pubDate>
        <title>Обобщения aka Generics.</title>
        <link>https://forum.sources.ru/index.php?showtopic=189695&amp;view=findpost&amp;p=1593965</link>
        <description><![CDATA[e-moe: Добавил выводы... <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2007-06-07T22:29:30+04:00">07.06.07, 18:29</time></span></span><br>
Только не спрашивайте при чем тут книга по C# %)<br>
Там на самом деле много интересного, а при достаточной фантазии кое-что можно от туда смело применять в контексте FPC :)]]></description>
        <author>e-moe</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=189695&amp;view=findpost&amp;p=1593868</guid>
        <pubDate>Thu, 07 Jun 2007 16:26:33 +0000</pubDate>
        <title>Обобщения aka Generics.</title>
        <link>https://forum.sources.ru/index.php?showtopic=189695&amp;view=findpost&amp;p=1593868</link>
        <description><![CDATA[e-moe: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=189695&view=findpost&p=1593845'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>volvo877 &#064; <time class="tag-quote__quoted-time" datetime="2007-06-07T15:58:14+00:00">07.06.07, 15:58</time></span><div class='quote '>А вот как это по-русски назвать я пока не придумал :)</div></div><br>
Ну если вдруг че придумаешь покрасивше - пиши ;)]]></description>
        <author>e-moe</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=189695&amp;view=findpost&amp;p=1593845</guid>
        <pubDate>Thu, 07 Jun 2007 15:58:14 +0000</pubDate>
        <title>Обобщения aka Generics.</title>
        <link>https://forum.sources.ru/index.php?showtopic=189695&amp;view=findpost&amp;p=1593845</link>
        <description><![CDATA[volvo877: В доках то, что в угловых скобочках названо <strong class='tag-b'>spaceholder</strong>-ом... А вот как это по-русски назвать я пока не придумал :)]]></description>
        <author>volvo877</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=189695&amp;view=findpost&amp;p=1593815</guid>
        <pubDate>Thu, 07 Jun 2007 15:26:58 +0000</pubDate>
        <title>Обобщения aka Generics.</title>
        <link>https://forum.sources.ru/index.php?showtopic=189695&amp;view=findpost&amp;p=1593815</link>
        <description><![CDATA[e-moe: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=189695&view=findpost&p=1593760'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>volvo877 &#064; <time class="tag-quote__quoted-time" datetime="2007-06-07T14:52:57+00:00">07.06.07, 14:52</time></span><div class='quote '>Что само собой вытекает из правил...</div></div><br>
Спасибо, подправил.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=189695&view=findpost&p=1593760'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>volvo877 &#064; <time class="tag-quote__quoted-time" datetime="2007-06-07T14:52:57+00:00">07.06.07, 14:52</time></span><div class='quote '>А вообще-то пока нет поддержки Generic-ов в процедурах/функциях - их очень неудобно использовать...</div></div><br>
Не спорю.. Но начало то положено что не может не радовать :) <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2007-06-07T15:32:36+00:00">07.06.07, 15:32</time></span></span><br>
Вот только меня смущает терминология.. не знаю как лучше...<br>
Особенно настараживает то, как я использовал слово &quot;шаблон&quot; для обозначения того, что внутри угловых скобочек..<br>
Просто может возникнуть путаница с С++ным тимплэйтом...<br>
<br>
или все ок?]]></description>
        <author>e-moe</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=189695&amp;view=findpost&amp;p=1593760</guid>
        <pubDate>Thu, 07 Jun 2007 14:52:57 +0000</pubDate>
        <title>Обобщения aka Generics.</title>
        <link>https://forum.sources.ru/index.php?showtopic=189695&amp;view=findpost&amp;p=1593760</link>
        <description><![CDATA[volvo877: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=189695&view=findpost&p=1593561'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>e&#045;moe &#064; <time class="tag-quote__quoted-time" datetime="2007-06-07T12:50:00+00:00">07.06.07, 12:50</time></span><div class='quote '>Но стоит заметить, что две одинаковые специализации одного и того же<br>
шаблона нельзя присваивать друг другу.</div></div>Что само собой вытекает из правил эквивалентности типов... Эти 2 типа просто не эквивалентны, только поэтому (Generic-и тут ни при чем) нельзя присваивать друг другу переменные разных типов. Как, например, и здесь:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TA = array[1 .. 10] of integer;</div><div class="code_line">&nbsp;&nbsp;TB = array[1 .. 10] of integer;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;A: TA;</div><div class="code_line">&nbsp;&nbsp;B: TB;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;A := B; // Здесь тоже ошибка ...</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
А вообще-то пока нет поддержки Generic-ов в процедурах/функциях - их очень неудобно использовать...]]></description>
        <author>volvo877</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=189695&amp;view=findpost&amp;p=1593561</guid>
        <pubDate>Thu, 07 Jun 2007 12:50:00 +0000</pubDate>
        <title>Обобщения aka Generics.</title>
        <link>https://forum.sources.ru/index.php?showtopic=189695&amp;view=findpost&amp;p=1593561</link>
        <description><![CDATA[e-moe: <span class='tag-size' data-value='14' style='font-size:14pt;'>Обобщения aka Generics.</span><br>
<br>
  Разработчикам, использующим <em class='tag-i'>объектно-ориентированное</em> программирование,<br>
хорошо известны его преимущества. Одно из ключевых преимуществ - возмож-<br>
ность повторно использовать код, т.е. создавать производный класс, нас-<br>
ледующий все возможности базового класса. В производном классе можно<br>
просто переопределить <em class='tag-i'>виртуальные </em>методы или добавить новые, чтобы изме-<br>
нить унаследованные характеристики для решения новых задач. <strong class='tag-b'>Обобщения<br>
(Generics)</strong> - еще один новый (начиная с версии 2.2.х) механизм повторного<br>
использования кода, а именно повторным использованием алгоритма.<br>
<br>
  По сути, разработчик определяет алгоритм, например сортировку, поиск,<br>
замену, преобразование и т.д. но не указывает конкретный тип данных, с<br>
которым работает алгоритм. Именно поэтому алгоритм можно обобщенно при-<br>
менять к объектам разных типов. Используя готовый алгоритм, другой раз-<br>
работчик просто указывает конкретный тип, например для сортировки -<br>
I<strong class='tag-b'>nteger, String</strong> или даже <strong class='tag-b'>Record </strong>и <strong class='tag-b'>Class</strong>.<br>
<br>
  В <strong class='tag-b'>FPC </strong>обобщения реализованы как своего рода <em class='tag-i'>макросы </em>для компилятора,<br>
которые он выполняет при <em class='tag-i'>специализации (specialize)</em> т.е. при их<br>
непосредственном использовании при указании конкретного типа. Именно<br>
поэтому описание и использование обобщений происходит за два этапа:<br>
  1. Описание обобщения по-сути описывает новый тип: <em class='tag-i'>макрос</em>, который в<br>
     последствии может выполнять компилятор.<br>
  2. Специализация обобщения - создание нового <span class='tag-u'>специализированного</span><br>
     класса из обобщения, путем исполнения компилятором макроса из прош-<br>
     лого этапа.<br>
<br>
  Рассмотрим, как же описываются обобщения в <strong class='tag-b'>FPC </strong>на простом примере<br>
списка:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;generic GList&#60;_T&#62; = class</div><div class="code_line">&nbsp;&nbsp; &nbsp;type public &nbsp; &nbsp; &nbsp; &nbsp; // Область типов (публичная)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Тип функции для метода ForEach</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;TForEachProc = procedure(item: _T);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var private &nbsp; &nbsp; &nbsp; &nbsp; // Область полей (приватная)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Arr : array of _T; &nbsp; &nbsp; &nbsp; &nbsp;// В основе списка лежит динамический массив</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Len : integer; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Длина массива</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Область публичных методов</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;function Add(item : _T): integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;procedure DeleteAt(p : integer);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;procedure ForEach(p : TForEachProc);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;procedure Clear;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;constructor Create;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;destructor Destroy; override;</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
<br>
  Ну и реализация методов:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">function GList.Add(item : _T): integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;SetLength(Arr,Len+1);</div><div class="code_line">&nbsp;&nbsp;Arr[Len] := item;</div><div class="code_line">&nbsp;&nbsp;Result := Len;</div><div class="code_line">&nbsp;&nbsp;inc(Len);</div><div class="code_line">end { Add };</div><div class="code_line">&nbsp;</div><div class="code_line">procedure GList.DeleteAt(p : integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i : integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if (p &#62;= 0) and (p &#60; Len) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for i := p to Len-2 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Arr[i] := Arr[i+1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;dec(Len);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SetLength(Arr,Len);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">end { DeleteAt };</div><div class="code_line">&nbsp;</div><div class="code_line">procedure GList.ForEach(p : TForEachProc);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i : integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;for i:= Low(Arr) to High(Arr) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;p(Arr[i]);</div><div class="code_line">end { ForEach };</div><div class="code_line">&nbsp;</div><div class="code_line">procedure GList.Clear;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Arr := nil;</div><div class="code_line">&nbsp;&nbsp;Len := 0;</div><div class="code_line">end { Clear };</div><div class="code_line">&nbsp;</div><div class="code_line">constructor GList.Create;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">&nbsp;&nbsp;Len := 0;</div><div class="code_line">end { Create };</div><div class="code_line">&nbsp;</div><div class="code_line">destructor GList.Destroy;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Clear;</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">end { Destroy };</div></ol></div></div></div></div><br>
<br>
  Как видно из примера, описание обобщений очень похоже не описание<br>
обычного класса за исключением локальных блоков описаний типов и пере-<br>
менных как в модулях или подпрограммах.<br>
<br>
  Рассмотрим некоторые особенности описания и реализации:<br>
  1. Тип <strong class='tag-b'>_T</strong> своего рода шаблон, вместо которого на этапе специализации<br>
     будет подставлен конкретный тип, заранее неизвестный. Кроме того,<br>
     идентификатор <strong class='tag-b'>_T </strong>не может быть использован ни для чего иного<br>
     кроме шаблона т.е.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure GList.ForEach(p : TForEachProc);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; i : integer;</div><div class="code_line">&nbsp;&nbsp;_t : integer; // ошибка!</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">end { ForEach };</div></ol></div></div></div></div><br>
<br>
  2. Локальный блок описаний типов (в примере) содержит тип <strong class='tag-b'>TForEachProc</strong>.<br>
     Обратите внимание, конкретный тип неизвестен при описании обобщения:<br>
     описание содержит ссылку на шаблон <strong class='tag-b'>_T</strong>. Все другие ссылки на иденти-<br>
     фикаторы должны быть известны при описании обобщения т.е. еще до<br>
     специализации.<br>
  3. Локальный блок переменных, введенный для удобства и повышения<br>
     &quot;читабельности&quot; кода полностью эквивалентен:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">private</div><div class="code_line">&nbsp;&nbsp;Arr : array of _T; &nbsp; &nbsp; &nbsp; &nbsp;// В основе списка лежит динамический массив</div><div class="code_line">&nbsp;&nbsp;Len : integer; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Длина массива</div><div class="code_line">public &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Область публичных методов</div><div class="code_line">&nbsp;&nbsp;function Add(item : _T): integer;</div><div class="code_line">&nbsp;&nbsp;...</div></ol></div></div></div></div><br>
<br>
  4. Оба локальных блока типов и переменных могут имеют необязательный<br>
     спецификатор видимости. При его отсутствии используется текущая<br>
     видимость.<br>
<br>
  Рассмотрим теперь <em class='tag-i'>специализацию </em>обобщений.<br>
<br>
  Однажды описанное обобщение может быть использовано для генерации других<br>
классов: это похоже на повторение описания класса только уже с шаблонами,<br>
указывающими на <span class='tag-u'>конкретные </span>типы данных.<br>
<br>
  Специализация возможна только в блоках <strong class='tag-b'>type </strong>и выглядит следующим образом:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TGL_int = specialize GList&#60;integer&#62;;</div><div class="code_line">&nbsp;&nbsp;TGL_str = specialize GList&#60;string&#62;;</div></ol></div></div></div></div><br>
<br>
  Описание же переменных с использованием специализации запрещено:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;TGL_smpl : specialize GList&#60;integer&#62;; // Ошибка</div></ol></div></div></div></div><br>
<br>
  Кроме того, тип специализации (тот что в угловых скобках) должен быть<br>
  известен. Рассмотрим пример:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;Generic TMyFirstType&#60;T1&#62; = Class(TMyObject);</div><div class="code_line">&nbsp;&nbsp;Generic TMySecondType&#60;T2&#62; = Class(TMyOtherObject);</div><div class="code_line">...</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TMySpecialType = specialize TMySecondType&#60;TMyFirstType&#62;; // Ошибка!</div></ol></div></div></div></div><br>
<br>
  Ошибка возникает потому, что тип <strong class='tag-b'>TMyFirstType </strong>лишь обобщение а не<br>
полностью определенный тип. Однако, следующий трюк вполне работоспособен:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TA = specialize TMyFirstType&#60;Atype&#62;;</div><div class="code_line">&nbsp;&nbsp;TB = specialize TMySecondType&#60;TA&#62;;</div></ol></div></div></div></div><br>
<br>
потому что <strong class='tag-b'>TA</strong> - полностью определенный, специализированный тип.<br>
<br>
  Но стоит заметить, что две одинаковые специализации одного и того же<br>
шаблона нельзя присваивать друг другу что само собой вытекает из правил<br>
эквивалентности типов... Эти 2 типа просто не эквивалентны, только поэтому<br>
(Generic-и тут ни при чем) нельзя присваивать друг другу переменные раз-<br>
ных типов(спасибо <a class='tag-url' href='http://forum.sources.ru/index.php?showuser=10362' target='_blank'>volvo877</a>). Например тут:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TA = specialize GList&#60;integer&#62;;</div><div class="code_line">&nbsp;&nbsp;TB = specialize GList&#60;integer&#62;;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;A : TA;</div><div class="code_line">&nbsp;&nbsp;B : TB;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;A := B; // Ошибка!</div></ol></div></div></div></div><br>
<br>
присвоение <strong class='tag-b'>В</strong> к <strong class='tag-b'>А</strong> вызывает ошибку.<br>
<br>
  Ну и в конце - пример использования:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{$mode objfpc}</div><div class="code_line">&nbsp;</div><div class="code_line">uses GnrcLst;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TGL_int = specialize GList&#60;integer&#62;;</div><div class="code_line">&nbsp;&nbsp;TGL_str = specialize GList&#60;string&#62;;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;l1 : TGL_int;</div><div class="code_line">&nbsp;&nbsp;l2 : TGL_str;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure ForEach_int(item : integer);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;WriteLn(item)</div><div class="code_line">end { ForEach_int };</div><div class="code_line">&nbsp;</div><div class="code_line">procedure ForEach_str(item : string);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;WriteLn(item)</div><div class="code_line">end { ForEach_int };</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;l1 := TGL_int.Create;</div><div class="code_line">&nbsp;&nbsp;l1.Add(3);</div><div class="code_line">&nbsp;&nbsp;l1.Add(7);</div><div class="code_line">&nbsp;&nbsp;l1.Add(15);</div><div class="code_line">&nbsp;&nbsp;Writeln(&#39;Список integer&#39;&#39;ов:&#39;);</div><div class="code_line">&nbsp;&nbsp;l1.ForEach(@ForEach_int);</div><div class="code_line">&nbsp;&nbsp;l1.DeleteAt(1);</div><div class="code_line">&nbsp;&nbsp;Writeln(&#39;Список integer&#39;&#39;ов после удаления 1го элемента:&#39;);</div><div class="code_line">&nbsp;&nbsp;l1.ForEach(@ForEach_int);</div><div class="code_line">&nbsp;&nbsp;l1.Free;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;WriteLn;</div><div class="code_line">&nbsp;&nbsp;l2 := TGL_str.Create;</div><div class="code_line">&nbsp;&nbsp;l2.Add(&#39;1th&#39;);</div><div class="code_line">&nbsp;&nbsp;l2.Add(&#39;2th&#39;);</div><div class="code_line">&nbsp;&nbsp;l2.Add(&#39;3th&#39;);</div><div class="code_line">&nbsp;&nbsp;Writeln(&#39;Список string&#39;&#39;ов:&#39;);</div><div class="code_line">&nbsp;&nbsp;l2.ForEach(@ForEach_str);</div><div class="code_line">&nbsp;&nbsp;l2.DeleteAt(1);</div><div class="code_line">&nbsp;&nbsp;Writeln(&#39;Список string&#39;&#39;ов после удаления 1го элемента:&#39;);</div><div class="code_line">&nbsp;&nbsp;l2.ForEach(@ForEach_str);</div><div class="code_line">&nbsp;&nbsp;l2.Free;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<br>
И его результаты работы:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Running &quot;d:\pp\work\t_gnrclst.exe &quot;</div><div class="code_line">Список integer&#39;ов:</div><div class="code_line">3</div><div class="code_line">7</div><div class="code_line">15</div><div class="code_line">Список integer&#39;ов после удаления 1го элемента:</div><div class="code_line">3</div><div class="code_line">15</div><div class="code_line">&nbsp;</div><div class="code_line">Список string&#39;ов:</div><div class="code_line">1th</div><div class="code_line">2th</div><div class="code_line">3th</div><div class="code_line">Список string&#39;ов после удаления 1го элемента:</div><div class="code_line">1th</div><div class="code_line">3th</div></ol></div></div></div></div><br>
<br>
  <span class="tag-font" data-value="Courier" style="font-family:Courier">Послесловие или что все это дает?..</span><br>
<br>
Перечислю пару плюсов минусов обобщений:<br>
<br>
+ <strong class='tag-b'>Безопасность типов</strong>. Когда обобщенный алгоритм специализируется<br>
компилятор понимает это и не допускает работу с другими типами.<br>
Так, вы не сможете в <strong class='tag-b'>GList&lt;MyClass1&gt;</strong> добавить элемент типа <strong class='tag-b'>MyClass2</strong><br>
несмотря на то что у них есть общий родитель <strong class='tag-b'>TObject </strong>чего не скажешь о<br>
стандартном классе <strong class='tag-b'>TList</strong>, который работает с указателями.<br>
<br>
+ <strong class='tag-b'>Более простой и понятный код</strong>. Поскольку компилятор обеспечивает безопас-<br>
ность типов, в исходном коде нужно меньше привидений типов. И как следствие,<br>
такой код проще писать и поддерживать.<br>
<br>
- <strong class='tag-b'>&quot;Распухание&quot; кода</strong>. Компилятор будет генерировать машинный код для<br>
каждого сочетания &quot;обобщение + специализация&quot; что в итоге может привести к<br>
увеличению размера приложения.<br>
<br>
- <strong class='tag-b'>Новизна</strong>. В <strong class='tag-b'>FPC</strong> обобщения только только появляются и многие возможности<br>
пока еще не реализованы. К ним относится и отсутствие поддержки <em class='tag-i'>Generic</em>-ов в<br>
процедурах/функциях что привносит некоторые неудобства...<br>
<br>
p.s. Все исходники можно найти в аттаче.<br>
<br>
2007 © Nikolay Labinskiy aka <a class='tag-url' href='http://forum.sources.ru/index.php?showuser=9927' target='_blank'>e-moe</a> <br>
<br>
<span class='tag-size' data-value='8' style='font-size:8pt;'>При написании использовались:<br>
* Оригинальная документация к FPC<br>
* CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C#.<br>
Мастер-класс. / Пер. с англ. - М.: Издательство &quot;РУсская редакция&quot;; СПб.: Питер, 2007. - 656 стр. : ил.</span><br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2007-06-07T12:50:20+00:00">07.06.07, 12:50</time></span></span><br>
Ну что ж , жду критики.. :)]]></description>
        <author>e-moe</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      </channel>
      </rss>
	