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

Деление на составные части работает на уровне файлов модулей (Unit в смысле языка Pascal). Если вы нуждаетесь в специальной защите объекта или его части, то для этого необходимо поместить его в отдельный модуль, в котором есть собственные секции interface и implementation.

Поля, свойства и методы, находящиеся в секции public, не имеют ограничений на видимость. Они доступны из других функций и методов объектов как в данном модуле, так и во всех прочих, ссылающихся на него. Обычно методы данной секции образуют интерфейс между объектного обмена сообщениями в период выполнения программы (run-time).

Поля, свойства и методы, находящиеся в секции private, доступны только в методах класса и функциях, содержащихся в том же модуле, что и описываемый класс. Такая директива позволяет скрыть детали внутренней реализации класса от всех. Элементы из секции private можно изменять, и это не будет сказываться на программах, работающих с объектами этого класса. Единственный способ для кого-то другого — обратиться к ним — переписать заново созданный вами модуль.

Раздел protected комбинирует функциональную нагрузку разделов private и public таким образом, что если вы хотите скрыть внутренние механизмы вашего объекта от конечного пользователя, этот пользователь не сможет в run-time использовать ни одно из объявлений объекта из его protected-области. Но это не помешает разработчику новых компонент использовать эти механизмы в других наследуемых классах, т. е. protected-объявления доступны у любого из наследников вашего класса.

Раздел published оказался необходимым при введении в Object Pascal возможности установки свойств и поведения компонент еще на этапе конструирования форм и самого приложения (design-time) в среде визуальной разработки программ Delphi. Именно published-объявления доступны через Object Inspector, будь это ссылки на свойства или обработчики событий. Во время исполнения приложения раздел объекта published полностью аналогичен public.

Следует отметить тот факт, что при порождении нового класса путем наследования возможен перенос объявлений из одного раздела в другой с единственным ограничением: если вы производите скрытие объявления за счет его переноса в раздел private, в дальнейшем его "вытаскивание" у наследника в более доступный раздел в другом модуле будет уже невозможен. Такое ограничение, к счастью, не распространяется на динамические методы-обработчики сообщений Windows.

Пример описания класса с заданными областями видимости приведен ниже.

4. ИНКАПСУЛЯЦИЯ

Классическое правило объектно-ориентированного программирования утверждает, что для обеспечения надежности нежелателен прямой доступ из других объектов к полям объекта: чтение и обновление их содержимого должно производиться посредством вызова соответствующих методов. Это правило и называется инкапсуляцией. До сих пор идея инкапсуляции внедрялась в программирование только посредством призывов и примеров в документации, но в языке же Object Pascal появилась соответствующая конструкция. В объектах Object Pascal пользователь объекта может быть полностью отгорожен от его полей при помощи свойств.

Работу со свойствами рассмотрим на следующем примере. Пусть мы создали при помощи дизайнера форм Delphi экранную форму Forml с двумя элементами визуальных компонент: Button 1 и Label 1 (рис. 1).

Рис. 1. Экранная форма примера

Кликнем кнопку Button1 и отредактируем исходный текст модуля до следующего текста:

unit testir;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type

TSomeType = String;

type

TAnObject = class(TObject)

private

FValue: TSomeType;

function GetAProperty: TSomeType;

procedure SetAProperty (ANewValue: TSomeType);

public

property AProperty: TSomeType

read GetAProperty

write SetAProperty;

end;

var

Form1: TForm1;

AnObject: TAnObject;

implementation

{$R *.DFM}

procedure TForm1.ButtonlClick(Sender: TObject);

begin

AnObject:= TAnObject.Create;

AnObject.AProperty:= 'Привет!';

Label1.Caption:= AnObject.AProperty;

end;

Перейти на страницу:

Похожие книги