Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП ОЗО 1.doc
Скачиваний:
39
Добавлен:
13.04.2015
Размер:
164.35 Кб
Скачать

Var a,b:Тcomp;

begin

a:= Тcomp.create; {вызывается конструктор}

a.input (6,10);

. . . . .

a.free

end.

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

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

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

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

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

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

Property,

read,

write,

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

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

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

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

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

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

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

Например:

Type TInt=class

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

Procedure impdata (x:integer); {метод записи в поле data}

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

Procedure Add(x:integer); {процедура сложения исходного

поля с х}

. . . . .

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

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

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

end;

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

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

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

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

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

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

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

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

Создадим класс целых чисел, реализующий арифметические операции над ними (например, сложение). Для программы используем консольное приложение в Delphi. На примере создания класса целых чисел рассмотрим 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

begin

data:=x; {записываем значение пар-ра x в поле data}

end;

Function TInt.Outdata; // описание метода чтения Outdata

begin

result:=data; {метод возвращает значение поля data}

end;

Procedure TInt.Add; {метод сложения поля data с пар-ром x }

begin

data:=data+x; {к полю data прибав. x, результат–в поле data}

end;

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