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