Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Области видимости

При описании нового класса важен разумный компромисс. С одной стороны, требуется скрыть от других методы и поля, представляющие собой внутреннее устройство класса (для этого и придуманы свойства). Маловажные детали на уровне пользователя объекта будут бесполезны и только помешают целостности восприятия. С другой стороны, если слишком ограничить того, кто будет порождать классы-потомки, и не обеспечить ему достаточный набор инструментальных средств и свободу маневра, то он и не станет использовать ваш класс.В модели объектов языка Object Pascal существует механизм доступа к составным частям объекта, определяющий области, где ими можно пользоваться (области видимости). Поля и методы могут относиться к четырем группам (секциям), отличающимся областями видимости. Методы и свойства могут быть общими (секция public), личными (секция private), защищенними (секция protected) и опубликованными (секция published). Есть еще и пятая группа, automated, она ранее использовалась для создания объектов СОМ; теперь она присутствует в языке только для обратной совместимости с программами на Delphi версий 3—5.Области видимости, определяемые первыми тремя директивами, таковы.

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

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

• Поля, свойства и методы секции protected также доступны только внутри модуля с описываемым классом. Но — и это главное — они доступны в классах, являющихся потомками данного класса, в том числе и в других модулях. Такие элементы особенно необходимы для разработчиков новых компонентов — потомков уже существующих. Оставляя свободу модернизации класса, они все же скрывают детали реализации от того,кто только пользуется объектами этого класса.

Рассмотрим пример, иллюстрирующийтри варианта областей видимости.

\ Листинг 1.1. Пример задания областей видимости методов!

unit First;

interface

type

TFirstObj = class

private

procedure Methodl;

protected

procedure Method2;

public

procedure Method3;

end;

procedure TestProcl;

unit Second;

interface

uses First;

type

TSecondObj = class(TFirstObj)

procedure Method4;

end;

procedure TestProc2;

Глава 1. Объектно-ориентированное программирование 37

implementation

uses dialogs;

var AFirstObj: TFirstObj;

procedure TestProcl;

begin

AFirstObj:= TFirstObj.Create;

AFirstObj.Methodl; {допустимо}

AFirstObj.Method2; {допустимо}

AFirstObj.Method3; {допустимо}

AFirstObj.Free;

end;

procedure TFirstObj.Methodl;

begin

ShowMessage(4');

end;

procedure TFirstObj.Method2;

begin

ShowMessage('2');

Methodl;

end;

procedure TFirstObj.Method3;

begin

ShowMessage ('3');

Method2;

end;

end.

implementation

var AFirstObj: TFirstObj;

ASecondObj: TSecondObj;

procedure TSecondObj.Method4;

begin

Methodl; {недопустимо -

произойдет ошибка компиляции}

Method2; {допустимо}

Method3; {допустимо}

end;

procedure TestProc2;

begin

AFirstObj:= TFirstObj.Create;

AFirstObj.Methodl; {недопустимо}

AFirstObj.Method2; {недопустимо}

AFirstObj.Method3; {допустимо}

AFirstObj.Free;

ASecondObj:= TSecondObj.Create;

ASecondObj.Methodl; {недопустимо}

ASecondObj.Method2; {допустимо}

ASecondObj.Method3; {допустимо}

ASecondObj.Free;

end;

end.

Если к этому примеру добавить модуль Third и попробовать вызвать методы классов TFirstObj и TSecondObj оттуда, то к числу недоступных будет отнесен и Method2 — он доступен только в том модуле, в котором описан. Наконец, область видимости, определяемая четвертой директивой —published, имеет особое значение для интерфейса визуального проектирования Delphi. В этой секции должны быть собраны те свойства объекта, которые будут видны не только во время исполнения приложения, но и из среды разработки. Публиковать можно свойства большинства типов, за исключением старого типа real, свойств типа "массив" и некоторых других. Все свойства компонентов, доступные через

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

type

TFirstObj = class

private

FNumber: Integer;

protected

property Number; Integer read: FNumber;

end;

TSecondObj = class(TFirstObj)

published

property Number;

end;

Если какое-либо свойство объекта из состава VCL принадлежит к области public, вернуть его в private невозможно. Напротив, обратная процедура широко практикуется в Delphi. У многих компонентов (например, TEdit) есть предок (в данном случае TCustomEdit), который отличается только отсутствием опубликованных свойств. Так что, если вы хотите создать новый редактирующий компонент, порождайте его на базе TCustomEdit и публикуйте только те свойства, которые считаете нужными. Разумеется, если вы поместили свойство в область private, "достать" его оттуда в потомках возможности уже нет.

<== предыдущая лекция | следующая лекция ==>
Перегрузка методов | Внутренняя структура объекта Obj1
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 362; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.017 сек.