Generic в Highlander
Написал Snowy   
22.08.2007
О генерик / дженерик / generic я уже рассказывал здесь
В Win32 версии генерики появятся только в Delphi 2008. А сейчас выходит хайлэндер, в котором генерики будут присутствовать в .NET версии. Поэтому уже сейчас можно посмотреть, как это будет выглядеть. Код будет одинаков, как для дотнет версии, так и для Win32.
Как я уже говорил, бета версия горца роздана бета-тестерам. Один из них - Боб Сварт демонстрирует пример работы с дженериками.
Оригинальный текст здесь
Далее переведённый вариант.

Structure

Я получил специальное разрешение обсуждать и показывать Highlander, а также некоторые публикации. Начну с описания generic в Delphi.NET.

Generics, также известные, как параметризованные типы, позволяют описывать то, что будер реально происходить, изначально не указывая тип данных, а тип будет передан позже как параметр. Синтакс такого параметра в Delphi указывается как <T>.

Очень простой пример generic-массива записывается следующим образом:
 type
   Some<T> = Array of T;
Для создания переменной этого типа, ма должны указать тип для <T> следующим образом:
 type
   SomeIntegers = Some<integer>;
 
 var
   X: SomeIntegers;
Этот пример просто показывает принцип записи generic. Наиболее полезное применение generic - использование в описаниях классов, например таких, как TQueue.
Объявление TQueue будет выглядеть так:
 type
   TQueue<AnyType> = class
   protected
    FList: System.Collections.Generic.List<AnyType>;
   public
    constructor Create;
    destructor Destroy; override;
 
    function Count: Integer;
    function AtLeast(count: Integer): Boolean;
    function Push(const itemT: AnyType): AnyType;
    function Peek: AnyType;
    function Pop: AnyType;
   end;
Реализация методов TQueue с использованием нового синтаксиса будет выглядеть так:
 constructor TQueue<AnyType>.Create;
 begin
   inherited Create;
   FList := System.Collections.Generic.List<AnyType>.Create
 end;
 
 destructor TQueue<AnyType>.Destroy;
 begin
   FList.Free;
   inherited Destroy
 end;
Конечно класс TQueue (очередь) уже существует. Но данный пример помогает проиллюстрировать декларативную мощь generic. Хотим мы иметь очередь целых чисел, или очередь печати или почтовых сообщений, используется всё тот же самый класс.
 function TQueue<AnyType>.Count: Integer;
 begin
   Result := FList.Count
 end;
 
 function TQueue<AnyType>.AtLeast(count: integer): Boolean;
 begin
   Result := FList.Count >= count
 end;
 
 function TQueue<AnyType>.Push(const itemT: AnyType): AnyType;
 begin
   FList.Insert(0, itemT);
   Result := itemT
 end;
 
 function TQueue<AnyType>.Peek: AnyType;
 begin
   Result := FList[FList.Count-1]
 end;
 
 function TQueue<AnyType>.Pop: AnyType;
 begin
   Result := Peek;
   FList.RemoveAt(FList.Count-1)
 end;
Использование такого класса будет выглядеть следующим образом:
 type
   TStringQueue = TQueue<string>;
 
 var
   S: TQueue<string>; // или TStringQueue;
 
 begin
   S := TStringQueue.Create;
   try
    S.Push('Delphi 2007 for Win32');
    S.Push('C++Builder 2007');
    S.Push('Highlander (aka Delphi 2007 for .NET)...');
    writeln(S.Pop);
    writeln(S.Pop);
    writeln(S.Pop);
   finally
    S.Free
   end
 end.
Заметьте, я использовал очередь string'ов. Но точно также можно использовать и с чем угодно, например с почтовыпи сообщениями, стоящими в очередь на отправку.
опубликовано
Добавить новыйПоиск
Добавить комментарий
Имя:
Веб-сайт:
Заголовок:
UBB-Код:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Security Image
Пожалуйста, введите проверочный код, который Вы видите на картинке.