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



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

  • Апрель
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31