Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции СД.doc
Скачиваний:
212
Добавлен:
19.03.2015
Размер:
1.81 Mб
Скачать
    1. 3.2. Директивы видимости

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

Существует четыре уровня сокрытия информации, которые задаются директивами Private (закрытый), Public (общедоступный), Protected (защищенный) и Published (публикуемый). Наиболее строгой директивой является Private, которая ограничивает видимость атрибутов и методов класса тем модулем, в котором расположен данный класс. Директива Public наоборот, наименее строга, и обеспечивает доступ к объявлениям класса из любого модуля, имеющего доступ к данному модулю.

Директива Protected внутри модуля, в котором объявлен класс, действует аналогично директиве Private, а извне модуля – аналогично директиве Private. Однако вне модуля доступ к защищенным полям данных и методов все же возможен внутри производного класса. При создании классов директива Private должна использоваться только для полей и методов, действительно зависящих от класса. Любые поля и методы, доступ к которым из производных классов может потребоваться, должны быть объявлены в разделе Protected.

Для директивы Published правила видимости аналогичны Public, но разница между ними заключается в том, что Published указывает компилятору добавлять информацию о типе времени выполнения (Run-Time Type Information, RTTI) для всех объявлений этого раздела. Информация RTTI необходима инспектору объектов при работе с компонентами на форме в среде Borland® Delphi.

Распределим методы и поля по уровням доступности:

TFigure = class

private

fColor: Byte;

fThickness: Byte;

fCanvas: TCanvas;

public

constructor Create;

destructor Destroy; override;

procedure SetColor(Value: Byte);

procedure SetThickness(Value: Byte);

procedure PrepareCanvas;

end;

    1. 3.3. Свойства классов

Другим способом сохранения целостности объекта является применение свойств. Свойства в объектной модели языка Паскаль предназначены для обеспечения доступа к скрытым атрибутам класса. Обратимся к классу TFigure и введем свойства:

TFigure = class

private

fColor: Byte;

fThickness: Byte;

fCanvas: TCanvas;

protected

procedure SetColor(Color: Byte);

procedure SetThickness(Thickness: Byte);

property Color: Byte read fColor write SetColor;

property Thickness: Byte read fThickness write SetThickness;

public

constructor Create;

destructor Destroy;

procedure PrepareCanvas;

end;

Для определения свойств используется зарезервированное слово Property, вслед за которым задается имя свойства, затем его тип и спецификаторы чтения-записи. По принятому соглашению все методы доступа начинаются с приставки Get и Set для получения и установки значений полей соответственно. Возможны три комбинации для режима чтения-записи: запись и чтение полей (наличие директив read и write), только запись (write only) и только чтение (read only).

В примере свойство Color предназначено для модификации и чтения поля fColor, а свойство fThickness – поля fThickness. Чтение будет производиться непосредственно путем обращения к полям, а запись – с помощью методов записи SetColor и SetThickness.

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

Color:=16;

будет транслировано в вызов:

SetColor(16);

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