Листинг 5.5. Задание областей видимости. Первый подход



Unit UsingPrivatel;           {Заголовок модуля}

Interface                       {Начало интерфейсной части}

Туре

ABC  = class           {Заголовок класса ABC}

private                   {Начало области видимости private)

a, b: Double;         (Свойства а и b имеют узкую область

видимости}

public                    {Начало области видимости public}

с: Double;                  {Свойство с имеет широкую область

  видимости}

Procedure SetA(NewA: Double);

{Метод SetK имеет широкую область видимости}

 Procedure SetB(NewB: Double);

{Метод SetB имеет широкую область видимости}

end;

Implementation                    {Начало описательной части}

Procedure ABC.SetA(NewA: Double);

{Описание метода SetA класса А В С}

Begin

а : = NewA;                       {Установка значения свойства а.]

с := а * Ь;                       {Обновление значения свойства c-

поддержание целостности данных}

end;

Procedure ABC.SetB(NewB: Double);

{Описание метода SetB класса ABC

 Begin

b := NewB;                       {Установка значения свойства b}

с := a* b;                      {Обновление значения свойства с -

поддержание целостности данных}

end;

end.                                            {Окончание модуля}

 

При такой конструкции класса вызывающая подпрограмма не сможет изменить значения свойств а и Ь, не повлияв тем самым на значение свойства с, поэтому целостность данных не будет нарушена. Однако свойство с доступно для изменения, даже если его значение пересчи­тано при установке значений а и Ь. В итоге оно может измениться, вызвав несоответствие данных. Таким образом, лучше было бы скрыть свойство с, реализовав специальный метод доступа к его значению (листинг 5.6).

 

Листинг 5.6. Задание областей видимости. Второй подход

Unit UsingPrivate2;          {Заголовок модуля}

 

Interface                        {Начало интерфейсной части}

 

Type

ABC2 = class              {Заголовок класса ABC}

Private                   {Начало области видимости private}

  с: Double;            {Свойство с имеет узкую область видимости}

Public                    {Начало области видимости public}

  a, b: Double;         {Свойства а и b имеют широкую область видимости}

Function GetC: Double;       {Метод GetC имеет широкую область видимости}

end ;

 

Implementation                   {Начало описательной части}

Function ABC2.GetC:Double;

{Описание метода GetC класса АВС2}

Begin

 с := а*b;         {Обновляем значение свойства с}

 Result := с{      Возвращаем значение с вызывающей подпрограмме}

end;

end.                       {Окончание модуля}

 

При такой конструкции класса целостность данных не может быть нарушена вызывающими подпрограммами, если только они не находятся в одном модуле с описываемым классом, то есть, в данном случае, в модуле UsingPrivate2. Единственным недостатком такого подхода является постоянный пересчет значения с при каждом обращении к методу GetC. Поэтому наиболее оптимальным вариантом решения нашей задачи будет сокрытие всех свойств класса и реализация методов доступа к ним через методы (см. листинг 5.7).

 

Листинг 5.7. Задание областей видимости. Третий подход (оптимальный)

unit UsingPrivate3;   {Заголовок модуля}

Interface

Type

АВСЗ = class

Private

a, b, c: Double;        {Все свойства имеют узкую область

видимости}

 public

Procedure SetA(NewA: Double);

{Все методы имеют широкую область видимости}

Procedure SetB(NewB: Double);

Function GetC: Double; end;

Implementation

Procedure ABC3.SetA(NewA: Double);

{Описание метода SetA класса АВСЗ}

 Begin

 a : = NewA ;

 с := a * b;

 end;

Procedure АВСЗ.SetB(NewB: Double);

{Описание метода SetB класса АВСЗ}

Begin

 b := NewB;

 с :=. a * b;

end;

Function ABC3.GetC: Double;

{Описание метода GetC класса АВСЗ}

Begin

 Result   := с;                   {Просто возвращаем значение с}

end;

 

End.

 

Property-свойства

 

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

 

Итак, описание свойств property в простейшем виде выглядит следующим образом:

property  <Имя свойства>: <Тип> read <Функция чтения значения>

write  <Процедура установки значения>;

 

Когда вызывающая подпрограмма обращается к свойству property для получения его значения, вместо конкретного значения возвращается результат функции, указанной по имени после модификатора read. Аналогично производится установка значения свойства — вместо прямой записи значения вызывается процедура, указанная после модификатора write. Соответственно, данная процедура должна принимать один параметр, причем его тип должен быть таким же, как тип самого свойства.

Модификаторы read и write могут не присутствовать в описании property-свойства одновременно. Если для свойства задана функция чтения, но не задана процедура записи, то такое свойство может быть использовано только для получения значения. Если задана процедура установки значения, но не задана функция чтения, то property-свойство можно использовать только в левой части оператора присваивания. В рассматриваемом нами примере свойства а и b должны быть доступны вызывающему фрагменту и для чтения и для записи, тогда как свойство с может быть доступно только для чтения.

Пример описания и использования property-свойства для поддержания корректности данных приведен в листинге 5.8.


Дата добавления: 2018-04-04; просмотров: 242; Мы поможем в написании вашей работы!






Мы поможем в написании ваших работ!