Главная » Delphi » Свойства

0

объекта (properties) —  это  специализированные средства доступа  к полям объекта, позволяющие изменять данные  его полей  и выполнять код его методов. По от ношению к компонентам свойства являются теми элементами, сведения о которых ото бражаются в окне  Object Inspector. Вот простой пример объекта, для которого опреде лено свойство:

TMyObject = class private

SomeValue: Integer;

procedure SetSomeValue(AValue: Integer);

public

property Value: Integer read SomeValue write SetSomeValue;

end;

procedure TMyObject.SetSomeValue(AValue: Integer);

begin

if SomeValue <> AValue then

SomeValue := AValue;

end;

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

Определение области видимости

Object Pascal предоставляет дополнительный контроль степени доступа  к членам классов  (полей и методов) с помощью директив protected, private, public, pub- lished и automated, открывающих соответствующие разделы объявлений. Синтак сис использования этих директив следующий:

TSomeObject = class private

APrivateVariable: Integer; AnotherPrivateVariable: Boolean;

protected

procedure AProtectedProcedure;

function ProtectMe: Byte;

public

constructor APublicContructor;

destructor APublicKiller;

published

property AProperty read APrivateVariable write APrivateVariable;

end;

За каждой  из директив может  следовать любое  необходимое количество объявле ний  полей  или методов. Требования хорошего тона  предполагают наличие отступа — аналогично тому, как это делается для имен классов.  Что же означают эти разделы?

•  Private (закрытый). Объявленные в данном  разделе переменные и  методы доступны  только  для того  кода, который находится в блоке  реализации самого объекта. Директива  private скрывает особенности  реализации  объекта от пользователей и защищает члены  этого  объекта от непосредственного доступа и изменения извне.

•  Protected (защищенный). Члены объекта, объявленные в разделе protected, доступны  объектам, производным от такого  класса.  Это  позволяет скрыть внут реннее устройство объекта от пользователя и в то же время  обеспечить необхо димую гибкость, а также  эффективность доступа к полям  и методам  объекта для его потомков.

•  Public (открытый). Объявленные в этом  разделе члены  объекта доступны  в любом месте программы. Конструкторы и деструкторы всегда должны  быть объявлены как public.

•  Published (публикуемый). Для членов объекта, объявленных в данном разделе, при   компиляции  будет  создана   информация  о  типах   времени  выполнения (RTTI — Runtime Type Information). Это позволит другим элементам приложения получать  информацию об элементах объекта, объявленных как published. В ча стности, подобная информация используется утилитой Object  Inspector при  по строении списков свойств объектов.

•  Automated (автоматизированный). Этот  раздел  сохранен только  для  обеспе чения совместимости с Delphi  2. Более  подробная информация по данной теме приведена в главе 15, “Разработка приложений COM”.Ниже  показано объявление класса  TMyObject (использовавшееся в разделе, по священном свойствам объекта), которое дополнено элементами, повышающими его целостность и логичность.

TMyObject = class private

SomeValue: Integer;

procedure SetSomeValue(AValue: Integer);

published

property Value: Integer read SomeValue write SetSomeValue;

end;

procedure TMyObject.SetSomeValue(AValue: Integer);

begin

if SomeValue <> AValue then

SomeValue := AValue;

end;

Теперь ни один из пользователей этого  класса не сможет  изменить значение Som- eValue непосредственно и вынужден  будет использовать только  интерфейс, предос тавляемый свойством Value.

Дружественные классы

В языке  C++ реализована концепция дружественных классов (friend classes), т.е. классов, которым разрешен доступ  к закрытым (private)  данным  и функциям другого  класса. В языке  C++ этот  механизм реализуется с помощью ключевого слова  friend. Хотя,  по большому счету, в Object  Pascal нет ни такого  ключевого слова, ни такого  понятия, тем не менее  фактически того же эффекта можно  добиться, просто описав  объекты в одном мо дуле. Описанные в одном  модуле  объекты имеют  право  доступа  к закрытым данным  и функциям друг друга, благодаря чему и обеспечивается “дружественность” в пределах модуля.

Внутреннее представление объектов

Все экземпляры классов  Object  Pascal на самом деле представляют собой  32 битовые указатели на данные этого экземпляра объекта, расположенные в динамической памяти. При  доступе  к полям,  методам  или  свойствам объекта компилятор автоматически вы полняет  скрытые действия, приводящие к  возвращению  данных   по  этим  ссылкам. В результате для постороннего взгляда  объект всегда  выглядит как статическая пере менная. Однако использование подобного механизма означает, что, в отличие от языка С++, язык  Object Pascal  не  предоставляет реального метода  для  размещения данных класса вне динамической памяти (например в сегменте данных приложения).

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии