Begin . . . . . . . . . . . . .

Write,

Read,

Property,

End.

Begin

Begin

Begin

Inherited destroy

Begin

Begin

Наследование конструкторов и деструкторов.

Наследование – это способность порожденного класса использовать характеристики класса-предка. Благодаря новым свойствам, которыми дополняется потомок, порожденный класс может обладать бỏльшими возможностями, чем его предок. Любой класс может быть порожден от другого класса, для этого при его описании указывается имя класса-родителя.

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

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

Вызов конструктора родительского класса достигается с помощью слова Inherited (унаследованный):

constructor <имя класса-потомка>. create;

inherited create;

{дополнительные действия}

End;

Аналогично можно в деструкторе класса-потомка вызвать деструктор класса-предка.

destructor <имя класса-потомка>. destroy;

{дополнительные действия}

end;

Слово inherited вызывает любой метод родительского класса, а не только конструктор и деструктор.

 

Например:

Type TPerson=class

name string;

constructor.create (x:string);

end;

Teacher=class (TPerson)

School: integer;

constructor.create (x:string,y:integer);

end;

constructor TPerson.create;

name:=x;

end;

constructor Teacher.create;

inherited.create (x); {вызывает конструктор родителя}

school:=y; {дополнительное действие – присвоение полю

School значения параметра y }

end;

var a: Teacher;

b: TPerson;

a:= Teacher.create(‘Иванов’,131);

b:= TPerson.create(‘Руслан’);

. . . . .

a.free;

b.free;

. . . . .


Свойства и инкапсуляция.

 

Инкапсуляция означает объединение данных и действий над ними в одном объектном типе.

Для обеспечения надежности нежелателен прямой доступ к полям объекта: чтение и обновление содержимого полей должно производиться посредством соответствующих методов – это называется инкапсуляцией.

В Delphi ограничение доступа к полям объекта осуществляется при помощи свойств объекта.

Определение: Свойства – это специальный механизм классов, регулирующий доступ к полям. Свойство определяется тремя элементами: полем и двумя методами, которые осуществляют его чтение и запись.

Свойства объявляются с помощью трех зарезервированных слов:

причем read и write считаются зарезервированными только в контексте объявления свойства.

Обычно свойство связано с некоторым полем, оно указывает те методы класса, которые должны исполняться при записи в это поле, и при чтении из него. Описание свойства:

Property <имя свойства>: <тип>read <имя метода 1>

write <имя метода 2>;

Методы чтения (вывода) и записи (ввода) всегда оформляются так:

Function <имя метода 1> : <тип>; { метод чтения}

Procedure <имя метода 2> (<параметр> : <тип>); {метод записи}

 

Например:

Type TInt=class

data:integer; // поле класса

Procedure impdata (x:integer);

Function Outdata:integer;

Procedure Add(x:integer);

Property dataInt:integer //свойство

read Outdata // метод чтения

write Impdata; // метод записи

end;

 

Доступ к значению свойства dataInt осуществляется через вызовы методов Outdata и Impdata. Однако в явном обращении к этим методам нет необходимости. Достаточно написать, например, для объекта a этого класса:

Var a:TInt; {объявляемa как объект классаTInt}

a. dataInt:=<значение>;

{<значение>–эточисло, которое присваивается полю a }

Затем переменной <результату> присвоить:

<результат>:= a.dataInt;

Компилятор при этом оттранслирует эти операторы в вызовы методов Outdata и Impdata. Т.о. свойство выглядит как обычное поле, но за всяким обращением к нему стоят нужные действия.

Создадим класс целых чисел, реализующий арифметические операции над ними (например, сложение). Для программы используем консольное приложение. На примере создания класса целых чисел рассмотрим 2 случая:

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

2. В описании класса есть свойство.

Создание класса целых чисел без свойства:

Program Integer_class1;

{$APPTYPE CONSOLE}

uses SysUtils;

 

Type TInt=class

data:integer; // поле класса

Procedure Impdata (x:integer); //метод записи в поле

Function Outdata:integer; // метод чтения из поля

Procedure Add(x:integer); //метод сложения целых чисел

end;

Procedure TInt.Impdata; //описание метода записи Impdata