На этом шаге мы рассмотрим различия старой и новой ООП-модели.
Из этого вытекает несколько следствий:
Следовательно, прежде чем обращаться к полям, методам и свойствам конкретного объекта, разработчик сначала должен в коде своего проекта создать этот объект (т.е. распределить память и инициализировать) с помощью вызова конструктора того класса, к которому принадлежит объект.
Поскольку больше нет необходимости синтаксически различать статические и динамические объекты, синтаксис описания и работы с объектами в новой ООП-модели был несколько упрощен.
Чтобы показать синтаксические особенности для сравнения приведем одинаковые фрагменты, записанные по старой и новой ООП-модели.
Старая ООП-модель:
program OldModel; uses WinCrt; type PMyDynObjType = ^TMyDynObjType; TMyDynObjType = object Field : Integer; constructor Init (Value : Integer); end; const n = 5; var MyDynObj : array [1..n] of PMyDynObjType; i : Integer; constructor TMyDynObjType.Init; begin Field := Value end; begin ClrScr; New (MyDynObj[1], Init(1)); for i := 2 to n do New (MyDynObj[i], Init(i)); for i := 1 to n do Writeln (MyDynObj[i]^.Field) end.
Новая ООП-модель:
program NewModel; {uses Forms;} type TMyDynObjClass = class Field : Integer; constructor Create (Value : Integer); end; const n = 5; var MyDynObj : array [1..n] of TMyDynObjClass; i : Integer; constructor TMyDynObjClass.Create; begin Field := Value end; begin MyDynObj[1] := TMyDynObjСlass.Create(1); for i := 2 to n do MyDynObj[i] : = TMyDynObjClass.Create(i); for i := 1 to n do Writeln (MyDynObj[i].Field); Readln; end.
Пример новой ООП-модели для большей корректности сравнения подготовлен для работы в консольном режиме.
Синтаксические отличия, как видно из примеров, заключаются в том, что теперь нет необходимости описывать указатели на класс и использовать операцию разыменования (^), которые подразумеваются по умолчанию, а также вызывать процедуру New для создания объекта и процедуру Dispose для удаления объекта.
Отметим, однако, что данные синтаксические нововведения относятся только к классам и объектам, а для описания динамических переменных других типов и работы с ними по прежнему используется старый синтаксис.
Поскольку, как отмечалось выше, Object Pascal поддерживает обе ООП-модели, и старую, и новую, то пример для старой ООП-модели также будет работать и в Delphi. Но, если в 16-разрядной версии Delphi этот пример работает точно в таком же виде, то, начиная с Delphi 2.0, модуль WinCrt не поддерживается. Поэтому для запуска примера в консольном режиме приложения нужно будет удалить ссылку на модуль WinCrt и вызов объявленной в нем процедуры ClrScr, а также добавить вызов Readln перед последним end для задержки окна консоли на экране монитора.
На следующем шаге мы поговорим о конструкторах.