Область видимости свойства или метода , помеченного модификатором 


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



ЗНАЕТЕ ЛИ ВЫ?

Область видимости свойства или метода , помеченного модификатором



    Pascal Delphi
Private описание класса и модуль, в котором описан класс, в том числе и для других классов также
Protected не используется как у private + в классах, унаследованных от этого класса
Public любая часть программы так же
Published не используется как у public + в Инспекторе объектов Delphi для визуального построения программ

 

Стандартное описание класса содержит свойства и методы, расположенные в порядке возрастания их видимости, но это правило не является обязательным.

Туре

           ……………………..

<Имя класса> = class

Private

<Имя свойства 1>: <Тип свойства 1>;

{Описание свойств класса, имеющих область видимости private}

………………..

<Имя свойства N>: <Тип свойства N>;

<Заголовок метода 1>;

{Описание методов класса, имеющих область видимости private}

<3аголовок метода М>;

Protected

<Имя свойства 1>: <Тип свойства 1>;

{Описание свойств класса, имеющих область видимости protected}

………………..

<Имя свойства N>: <Тип свойства N>;

<Заголовок метода 1>;

{Описание методов класса, имеющих область видимости protected}

………………..

<Заголовок метода М>;

  public

<Имя свойства 1>: <Тип свойства 1>;

{Описание свойств класса, имеющих-область видимости public}

………………..

<Имя свойства N>: <Тип свойства N>;

<Заголовок метода 1>;

{Описание методов класса, имеющих область видимости public}

………………..

<Заголовок метода М>;

Published

......... 

                 {Описание специальных свойств

класса (property), имеющих область видимости published}

End;

Различные области видимости свойств и методов объекта предназначены для упрощения поддержания целостности информации в объектах. Рассмотрим класс, в котором содержатся три свойства — а, b и с, причем с является произведением а и b. Если свойства а, b и с будут иметь широкую область видимости public, то есть будут доступны из любого фрагмента программы, то объект — экземпляр такого класса может содержать некорректные данные, так как существует возможность изменения свойств а и b без пересчета свойства с. Для выхода из такой ситуации можно предложить два подхода, и оба они связаны с использованием областей видимости свойств объекта.

Первый подход (см. листинг 5.5) состоит в том, чтобы скрыть свойства а и b от вызывающих подпрограмм, назначив им узкие области видимости, например private или protected. Выбор того или иного модификатора определяется необходимостью использования скрываемых свойств в классах-потомках данного класса. Если такой необходимости нет, то назначается область видимости private, если объекты-потомки должны иметь прямой доступ к свойствам, то назначается область видимости protected.

В любом случае, внешние подпрограммы не смогут обратиться к свойствам а и b, поэтому придется предусмотреть методы, которые их устанавливают. В этих методах, помимо установки значений свойств, должен производиться пересчет свойства с. Это будет гарантировать целостность данных объекта при изменении свойств а и b.

Заметим, что методы установки должны иметь широкую область видимости, чтобы к ним можно было обратиться из любого места программы.

 

Листинг 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

ABC 2 = 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.                       {Окончание модуля}

 

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

 

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

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

Interface

Type

АВСЗ = class

 private

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

видимости}

  public

Procedure SetA(NewA: Double);

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



Поделиться:


Читайте также:




Последнее изменение этой страницы: 2021-04-04; просмотров: 47; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.227.190.93 (0.01 с.)