Классы на Object Pascal – Описание классов


Классы на Object Pascal

Описание классов на Object Pascal

Тип данных — статический описание совокупности динамических объектов, объединенных определенными операциями. В ООП каждый тип базируется на определенном классе. Класс — это тип данных с частичной или полной реализацией операций.

view plaincopy to clipboardprint?

  1. type <имя класса> = class (<имя родительского класса>)
  2. private
  3. {Поля, методы}
  4. protected
  5. {Поля, методы, свойства}
  6. public
  7. {Поля, методы, свойства}
  8. published
  9. {Поля, методы, свойства}
  10. end;

 

type <имя класса> = class (<имя родительского класса>)

private

{Поля, методы}

protected

{Поля, методы, свойства}

public

{Поля, методы, свойства}

published

{Поля, методы, свойства}

end;

Имя класса — любой идентификатор; как правило, начинается с большой буквы Т. Имя сверхкласса может не указываться, тогда считается, что класс является непосредственным потомком класса TObject.В ObjectPascal класс TObject является базовым классом для всех объектов.

В описании класса определяют поля и методы.

Поля — это определенные характеристики объектов класса (описывают как переменные).

Методы — это операции над объектами класса (описывают как процедуры и функции).

Следующие директивы управляют правами доступа к элементам класса.

Private (личный, закрытый) содержит поля и методы, которые используются только объектами этого класса.

Protected (защищенный) содержит поля и методы, доступные также для всех потомков этого класса.

Public (открытый) — поля и методы, а также свойства, доступные для внешнего использования, в том числе по объектам других классов.

Published (для публикации) содержит поля, методы, которые являются открытыми, а также свойства которые будут доступны при проектировании в инспекторе объектов Delphi (для просмотра и изменения).

Если директивы не указаны, то по умолчанию считается, что установлены директиву Published.

Пример класса: TPoint — точки на плоскости

view plaincopy to clipboardprint?

  1. type
  2. TPoint = class
  3. X, Y: Real; // координаты в декартовой системе
  4. function Ro: Real; // координаты
  5. function Fi: Real; // в полярной системе
  6. function Distance (p: TPoint): Real;
  7. // расстояния между двумя точками;
  8. procedure Translate (dx, dy: Real)
  9. // перемещения;
  10. procedure Rotate (p: TPoint; f: Real)
  11. // вращения точки на определенный угол вокруг другой точки (центра вращения)
  12. procedure Scale (k: Real)
  13. // масштабирование
  14. end;
Читать  Одномерные массивы – Понятие массива и его свойства, инициализация массива

 

type

 

TPoint = class

 

X, Y: Real; // координаты в декартовой системе

 

function Ro: Real; // координаты

 

function Fi: Real; // в полярной системе

 

function Distance (p: TPoint): Real;

 

// расстояния между двумя точками;

 

procedure Translate (dx, dy: Real)

 

// перемещения;

 

procedure Rotate (p: TPoint; f: Real)

 

// вращения точки на определенный угол вокруг другой точки (центра вращения)

 

procedure Scale (k: Real)

 

// масштабирование

 

end;

В этом описании:

X, Y — поля класса;

Ro, Fi, Distance, Translate, Rotate, Scale — методы класса.

Возможно описание, где X и Y будут методами, а Ro и Fi — полями:

// …

Ro, Fi: Real; // координаты в полярной системе

function X: Real; // координаты

function Y: Real; // в декартовой системе

В Object Pascal описание класса вместе с полями и прототипами методов включается в открытую часть программного модуля, называется интерфейсом (англ. Interface).Реализация методов включается в закрытой части модуля называется реализацией (англ. Implementation).

view plaincopy to clipboardprint?

  1. implementation
  2. function TPoint.Ro: Real;
  3. begin
  4. Ro = sqrt (sqr (X) + sqr (Y))
  5. // или
  6. // Result: = sqrt (sqr (X) + sqr (Y))
  7. end;
  8. function TPoint.Fi: Real; // в полярной системе
  9. begin
  10. Fi = ArcTan (Y / X);
  11. end;
  12. function TPoint.Distance (p: TPoint): Real;
  13. begin
  14. Distance = sqrt (sqr (Xp.X) + sqr (Yp.Y))
  15. end;
  16. procedure TPoint.Translate (dx, dy: Real)
  17. begin
  18. X = X + dx;
  19. Y = Y + dy;
  20. end;
  21. procedure TPoint.Rotate (p: TPoint; f: Real)
  22. var x1, y1: real;
  23. begin
  24. x1 = (Xp.X) * cos (f) — (Yp.Y) * sin (f) + p.X;
  25. y1 = (Xp.X) * sin (f) + (Yp.Y) * cos (f) + p.Y;
  26. X = x1; Y = y1;
  27. end;
  28. procedure TPoint.Scale (k: Real)
  29. begin
  30. X = k * X;
  31. Y = k * Y;
  32. end;

 

implementation

 

function TPoint.Ro: Real;

 

begin

 

Ro = sqrt (sqr (X) + sqr (Y))

 

// или

 

// Result: = sqrt (sqr (X) + sqr (Y))

 

end;

 

function TPoint.Fi: Real; // в полярной системе

 

Читать  Паскаль Тема 5: Табличные величины, массивы, Поиск в массивах элементов

begin

 

Fi = ArcTan (Y / X);

 

end;

 

function TPoint.Distance (p: TPoint): Real;

 

begin

 

Distance = sqrt (sqr (Xp.X) + sqr (Yp.Y))

 

end;

 

procedure TPoint.Translat e (dx, dy: Real)

 

begin

 

X = X + dx;

 

Y = Y + dy;

 

end;

 

procedure TPoint.Rotate (p: TPoint; f: Real)

 

var x1, y1: real;

 

begin

 

x1 = (Xp.X) * cos (f) — (Yp.Y) * sin (f) + p.X;

 

y1 = (Xp.X) * sin (f) + (Yp.Y) * cos (f) + p.Y;

 

X = x1; Y = y1;

 

end;

 

procedure TPoint.Scale (k: Real)

 

begin

 

X = k * X;

 

Y = k * Y;

 

end;

Описание объектов на Object Pascal. создание объектов

Объект — это экземпляр определенного класса.Объект описывается как переменная, тип переменной — это класс объекта.

пример

var P1, P2: TPoint;

Название объекта является указателем на этот объект. При описании переменных-объектов в памяти выделяется место только под указатель (4-байтный адрес). Начальное значение этого адреса равен nil (неопределенный указатель).

Таким образом, объекты в Object Pascal являются динамическими переменными, то есть создаются во время работы программы.Но, при работе с объектами, в отличие от указателей, розадресация указателя (^), процедуры New и Dispose не используются.

Для создания объектов используют специальный метод — конструктор, который обозначается ключевым словом constructor.Как правило, этот метод называется Create.

пример:

view plaincopy to clipboardprint?

  1. type TPoint = class
  2. // …
  3. constructor Create;
  4. // …
  5. end;
  6. var P1, P2: TPoint;
  7. constructor TPoint.Create;
  8. Begin
  9. X = 0;
  10. Y = 0;
  11. End;
  12. begin
  13. P1 = TPoint.Create;
  14. P2 = TPoint.Create;
  15. // …
  16. end;

 

type TPoint = class

 

// …

 

constructor Create;

 

// …

 

end;

 

var P1, P2: TPoint;

 

constructor TPoint.Create;

 

Begin

 

X = 0;

 

Y = 0;

 

End;

 

begin

 

P1 = TPoint.Create;

 

P2 = TPoint.Create;

 

// …

 

end;

В данной реализации конструктор вызывается без параметров.

Можно реализовать конструктор в виде:

constructor TPoint.Create (a, b: Real)

begin

X = a;

Y = b;

end;

Тогда вызвать конструктор можно, например

P1 = TPoint.Create (1, 2);

Внутри методов можно использовать переменную Self, которая обозначает объект, для которого вызывается данный метод.В частности, для решения коллизий (противоречий) между названиями полей и локальных переменных и параметров методов можно указать эту переменную перед названиями полей, например

Читать  Динамические массивы Pascal

Self.X = X;

Self.Y = Y;

Если конструктор реализовано, но в нем нет присвоении начальных значений полям объекта, то происходит инициализация по умолчанию. Числовые переменные инициализируются значениями 0, символьные — нуль-символом (# 0), логические переменные — значением false, указатели — значением nil.

Таким образом, в отличие от указателей процедура new для создания объектов не используется, если существует конструктор.Но переменная, которая обозначает объект в операциях используется подобно указателей.

Инициализация объектов, обращения к полям и методам. свойства

При написании программы доступ к полям (для чтения) не отличается от доступа к методу без аргументов (функции) — принцип однородного доступа. Например:

X1 = P1.X; // обращение к полю;

Ro1 = P1.Ro; // обращение к методу.

Объект, для которого вызывается метод, называемый также получателем этого метода (объект Р1 является получателем метода Ro)

Если нужно изменить поле объекта после создания, то можно использовать оператор присваивания, например

P1.X = 6; // непосредственная изменение значения поля

Во многих случаях прямая изменение поля может быть некорректной. Например, для объектов D 1, D 2 класса TDate (календарные даты) с полями Year, Month, Day:

D1.Month = 13; D2.Day = 32; // некорректно!

Поэтому, как правило, значения полей класса могут изменять только методы данного класса (или дочерних классов).Для корректного доступа к полям класса обращаются через свойства (англ. Property):

property <имя свойства>: <тип>

read <имя поля или метода для чтения>

write <имя поля или метода записи>

default <значение по умолчанию>;

Метод для чтения — это функция без параметров, которая возвращает значение с типом свойства (например GetMonth, GetDay).Также эту функцию называют селектором.

Метод записи — это процедура, которая изменяет значение определенного поля при определенных условиях (SetMonth, SetDay).Также эта процедура называется модификатором.Значение является переменная с типом поля.

Поля и методы для чтения или записи объявляются перед описанием свойства, в описании только указываются их названия.

Читать  Технология построения алгоритмов

Значение по умолчанию — это определенное значение свойства, которое задается при создании объекта (для полей Month и Day может быть равным 1).

пример:

view plaincopy to clipboardprint?

  1. type TDate = class
  2. private
  3. aDay, aMonth, aYear: integer
  4. protected
  5. procedure SetDay (value: integer);
  6. // …
  7. published
  8. property Day: integer read aDay
  9. write SetDay
  10. default 1;
  11. end;
  12. procedure TDay.SetDay (value: integer);
  13. begin
  14. if value in [1..31]
  15. aDay = value;
  16. end;

 

type TDate = class

 

private

 

aDay, aMonth, aYear: integer

 

protected

 

procedure SetDay (value: integer);

 

// …

 

published

 

property Day: integer read aDay

 

write SetDay

 

default 1;

 

end;

 

procedure TDay.SetDay (value: integer);

 

begin

 

if value in [1..31]

 

aDay = value;

 

end;

Свойства — это еще один способ управлять доступом к полям класса (рядом с директивами private, protected, public, published).

присвоение объектов

У оператора присвоения возможны две семантики:

— семантика копирования;

— семантика указателей.

В первом случае (для всех переменных, кроме объектов и указателей) содержание правой части выражения копируется в содержание левой части (создается копия в памяти).

Во втором случае (для объектов и указателей) левая часть будет указывать на содержание правой части (копия в памяти не создается).

пример:

view plaincopy to clipboardprint?

  1. var P1, P2: TPoint;
  2. P1 = TPoint.Create (3, 4); // P1.X = 3;   P1.Y = 4;
  3. P2 = TPoint.Create (5, 7); // P2.X = 5,   P2.Y = 7;
  4. P1 = P2; // P1.X = 5,   P1.Y = 7;
  5. X: = 10;                            // P2.X = 10;   P1.X = 10;

 

var P1, P2: TPoint;

 

P1 = TPoint.Create (3, 4);    // P1.X = 3; P1.Y = 4;

 

P2 = TPoint.Create (5, 7);    // P2.X = 5, P2.Y = 7;

 

P1 = P2; // P1.X = 5, P1.Y = 7;

 

P2.X: = 10;                           // P2.X = 10; P1.X = 10;

В результате присвоения объект P1 будет указывать на содержание объекта P2. Предыдущий содержание объекта P1 стал недосягаемым.

Для создания копии объекта, как правило, описывается и реализуется специальный метод Assign, который делает присвоении каждого поля отдельно по новому указателю.

Читать  Лекция Паскаль 1 – Создание проекта, создание форм, обработка событий

P1.Assign (P2) // P1 = P2

Проверка на равенство

При сравнении двух переменных, аналогично к присвоению есть две семантики: копирование и указателей.

Для чисел и символьных переменных условием равенства является одинаковое побитовое представление в памяти (семантика копирования).

Для переменных составных типов используется равенство элементов. Возможна ситуация, когда: а = b, но bа (когда переменная b содержит больше элементов, чем переменная а).

пример:

а — точка в двумерном пространстве, b — точка в трехмерном пространстве.

Для объектов равенство достигается, когда существует равенство указателей (семантика указателей).

If P1 = P2 then

{…}

Альтернативная проверка на равенство (для объектов с различными указателями) может быть реализована с помощью специального метода Equals.

If P1.Equals (P2) then

{…}

уничтожение объектов

Объекты — динамические переменные, которые создаются и уничтожаются во время работы программы (run-time), поэтому уничтожение объекта предусматривает освобождение памяти.С этой целью используют специальный метод — деструктор (обозначается ключевым словом destructor).Как правило, этот метод называется Destroy.

Кроме деструктора в описании класса обычно вводится метод Free, который проверяет переменная Self важно nil.Для пустая объекта вызывается деструктор.

Пример.

procedure TPoint.Free;

begin

if Self <> nil then Destroy;

end;

При этом автоматического определения значения объектной переменной в nil не происходит.

управление памятью

Для освобождения памяти, которая выделяется под объекты, которые больше не нужны, возможны 3 способа:

  1. Ручная освобождения (средствами языков программирования);
  2. «Автоматическое уборка мусора» (англ. Аutomatic garbage collection).Под «мусором» понимают объекты, содержание которых стал недосягаемым, например, вследствие присвоения.   Для разных операционных систем разработаны специальные процедуры, которые отслеживают эти объекты с определенными временными интервалом и уничтожают.
  3. Каждому объекту при создании назначается владелец (другой объект), который руководит процессом освобождения памяти.(Например, форма является владельцем всех объектов, находящихся на ней).

Типичные ошибки при освобождении памяти

  1. Попытка использовать память, которая еще не выделена;
  2. Выделенная память никогда не освобождается;
  3. Память звильняюеться двумя независимыми процедурами;
  4. Попытка использовать уже освобожденную память.
[Всего голосов: 3    Средний: 5/5]