Вы видите, что коллекции могут хранить любой тип данных динамически и что они содержат методы, помогающие Вам эффективно обращаться к данным коллекции. В действительности TCollection определяете 23 метода. Когда Вы используете коллекции в Ваших программах, Вы удивитесь скорости их работы. Они спроектированы для обеспечения гибкости и реализованы на удивление быстрыми. Сейчас Вы увидите реальную мощь коллекций: элементы могут обрабатываться полиморфно. Это означает, что Вы можете делать больше, чем просто сохранять тип объекта в коллекции; Вы можете хранить множество различных типов объектов из любого места в иерархии объектов. В примерах, которые мы рассматривали до сих пор, все элементы коллекции были одного типа. Но коллекции могут хранить любые объекты, порожденные от TObject и Вы можете свободно смешивать эти объекты. Обычно Вам необходимо иметь объекты с определенным сходством. Как пример рассмотрим программу, которая помещает 3 различных графических объекта в коллекцию. Затем итератор ForEach используется для прохода по коллекции и отображения каждого объекта. Этот пример использует модуль Graph и драйверы BGI, поэтому выо время компиляции GRAPH.TPU должен быть в текущем справочнике или в справочниках модулей (Options/Directories/Unit Directory). При выполнении программы перейдите в справочник, содержащий драйверы .BGI или модифицируйте вызов InitGraph, чтобы указать их расположение (например C:\TP\BGI). Вначале определим объект абстрактного предка.
{ TVGUID20.PAS } type PGraphObject = ^TGraphObject; TGraphObject = object(TObject) X,Y: Integer; constructor Init; procedure Draw; virtual; end;
Вы видите из этого объявления, что каждый графический объект может инициализироваться (Init) и отображаться на графическом экране (Draw). Теперь определим точку, окружность и прямоугольник, наследуя их от общего предка:
PGraphPoint = ^TGraphPoint; TGraphPoint = object(TGraphObject) constructor Init; procedure Draw; virtual; end;
PGraphCircle = ^TGraphCircle; TGraphCircle = object(TGraphObject) Radius: Integer; constructor Init; procedure Draw; virtual; end;