
Ооп в языке Object Pascal
Класс – специальный тип данных, содержащий как данные (поля), так и методы их обработки (процедуры и функции). Общепринято имена классов начинать с буквы T (например, TForm).
Объект – экземпляр класса, переменная соответствующего типа.
В объектном Паскале реализованы три основных принципа ООП.
1. Инкапсуляция – объединение в классе данных и подпрограмм для их обработки. Данные содержатся в полях класса, а подпрограммы для их обработки называются методами. Прямой доступ к полям по правилам ООП нежелателен, поэтому предусмотрены специальные конструкции, называемые свойствами, которые осуществляют чтение и запись в поле с помощью вызова соответствующего метода. Примеры (автомобиль). Кроме этого некоторые поля и методы можно сделать доступными только для методов класса.
2 Наследование – можно эффективно использовать ранее созданные классы, порождая от них потомков. Порождённый класс автоматически наследует поля, свойства и методы своего родителя, но может их изменить или добавить новые. Цепочки наследования могут быть неограниченной длины. Все классы являются потомками класса TObject. Этот класс не имеет полей и свойств, зато его методы позволяют создавать и удалять объекты. Если мы создаём потомка класса TObject, то это можно не указывать.
3. Полиморфизм – потомки могут переопределять методы, определённые в классе, от которого они порождаются.
В общем виде класс объявляется в разделе описания типов следующим образом
Type <имя класса> = class (<имя класса-родителя>)
<список полей, методов и свойств – членов класса>
end;
Если имя класса-родителя не указано, то новый класс будет порождён от стандартного класса TObject, который содержит общие для всех классов Delphi методы.
Классы могут быть описаны либо в секции интерфейса модуля, либо на верхнем уровне вложенности секции реализации. Не допускается описание классов внутри процедур и других блоков кода. Разрешено их опережающее объявление, как в следующем примере:
type
TFirsTObject = class;
TSecondObject = class (TObject)
Fist: TFirsTObject;
...
end;
TFirsTObject = class(TObject)
...
end;
Поля
Поля – встроенные в класс данные. Подобны полям записи, но могут быть любых типов, в том числе классами.
Type TStudent = class
Age: Integer;
Name: String;
Birthday: TDateTime;
A: TObject
End;
Var S1, S2: Tstudent;
Begin
. . . . . .
S1.Age:=18;
S1.Name:=’Петр’;
S2.Age:=19;
S2.Name:=’Наталья’;
S1, S2 – экземпляры класса (объекты), значения полей могут различаться для разных объектов.
Для доступа к полям объекта используется составное имя, состоящее из имени объекта и имени поля, разделённых точкой (как в записях).
Методы – встроенные в класс процедуры и функции.
Type TStudent = class
Age: Integer;
Name: String;
Birthday: TdateTime;
Function Age: integer;
Procedure ShowInfo;
A: TObject
End;
Для обращения к методам также используются составные имена:
X:= S1.Age;
S1.ShowInfo;
У всех экземпляров одного и того же класса методы общие. Внутри методов можно использовать поля класса без указания имени объекта. Кроме этого внутри метода можно использовать идентификатор Self (англ. сам)– обозначающий текущий объект (чтобы отличить поля от локальных переменных с тем же именем).
Методы объявляются в том же модуле, где описан класс, ниже его описания.
Function Tstudent.Age: integer;
Begin
Result:=round((Today- BirthDay)/365);
End;
Заголовок метода должен в точности соответствовать описанию класса.
Методы можно переопределять в порождённом классе. Для вызова родительского метода из переопределённого используется служебное слово Inherited (англ. унаследованный).
Типы методов рассмотрим ниже.
Создание и удаление объекта
Любой класс в Delphi содержит специальные метод — конструктор для создания объекта и деструктор для удаления объекта. Они наследуются от TObject и могут быть изменены в потомке. Называются Create и Destroy соответственно.
Переменная-объект в Delphi является фактически указателем, поэтому задача конструктора – выделить память для полей и инициализировать их. Конструктор должен быть обязательно вызван перед первым обращением к объекту!
Деструктор освобождает динамическую память и разрушает объект.
Для вызова конструктора необходимо экземпляру класса присвоить вызов конструктора для класса:
Type TStudent = class
Age: Integer;
Name: String;
Constructor Create(N: String);
Destructor Destroy;
End;
Constructor Create(N: String);
Begin
Inherited Create; {вначале вызываем унаследованный от предка конструктор}
Name:=N
End;
S1:=Tstudent.Create(’Вася’);
S1.Destroy.
Конструкторы и деструкторы описываются с помощью соответствующих слов.
В классе могут быть определены методы, которые можно вызывать без создания объектов – по имени класса. Это так называемые методы класса. Они описываются с помощью слова class:
Type TStudent = class
Age: Integer;
Name: String;
Class function Univer: String;
End;
Writeln(Tstudent.Univer);