procedure TFirstObj.Methodl;
begin ShowMessage ('1');
end;
procedure TFirstObj.Method2;
begin
ShowMessage(12');
Methodl;
end;
procedure TFirstObj.Method3;
begin Shov*lessage (' 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 (теперь он называется геа148), свойств типа "массив" и некоторых других. Все свойства компонентов, доступные через

Инспектор объектов, являются их опубликованными свойствами. Во время выполнения такие свойства общедоступны, как и 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, "достать" его оттуда в потомках возможности уже нет.

Объект изнутри

Теперь, когда мы разобрались с основными определениями и механизмами ООП, настало время более подробно изучить, что представляет собой объект и как он работает. Ясно, что каждый экземпляр класса содержит отдельную копию всех его полей. Ясно, что где-то в его недрах есть указатели на таблицу виртуальных методов и таблицу динамических методов. А что еще там имеется? И как происходит вызов методов? Вернемся к примеру из разд. "Полиморфизм"данной главы:


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Июнь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс