Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Області видимості елементів класу

Для розмежування доступу до властивостей і методів примірників класів між різними частинами програми передбачені модифікатори доступу («видимості»), наведені в табл. 2.1.

Модифікатор доступу в Delphi (як і в Pascal, але на відміну від деяких інших мов програмування) відноситься не до конкретного властивості або методу класу, а до всіх елементів класу (властивостей і методів), опис яких розташовується після вказівки модифікатора. Один і той же модифікатор може вказуватися в описі класу більше одного разу.


Таблиця 2.1. Порівняльна таблиця модифікаторів доступу в Paskal та Delphi

Модифікатор Область видимості властивості чи методу, поміченого модифікатором
Paskal Delphi
Private Опис класу та модуль, в якому описаний клас, в тому числі і для інших класів Так само
Protected Не використовується Як у Private + в класах, успадкованих від цього класу
Public Будь-яка частина програми Так само
published Не використовується Як у Public + в Інспекторі об’єктів Delphi для візуальної побудови програм

 

Стандартний опис класу містить властивості і методу, розташований-ні в порядку зростання їх видимості, але це правило не є обов'язковим.

Туре

<Ім’я класу> = class private

<Ім’я властивості 1>: <Тип властивості

(Опис властивостей класу, що мають область видимості private)

< Ім’я властивості N>: <Тип властивості N>;

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

(Опис методів класу, що мають область видимості private)

Заголовок метода М>; 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 без перерахунку властивості с. Для виходу з такої ситуації і можна запропонувати два підходи, і обидва вони пов'язані з використанням областей видимості властивостей об'єкта.

Перший підхід (див. лістинг 2.5) полягає в тому, щоб приховати властивості а і b від викликають підпрограм, призначивши їм вузькі області видимості, наприклад private або protected. Вибір того чи іншого модифікатора визначається необхідністю використання приховуваних властивостей у класах-нащадках даного класу. Якщо такої необхідності немає, то призначається область видимості private, якщо об'єкти-нащадки повинні мати прямий доступ до властивостей, то призначається область видимості protected.

У будь-якому випадку, зовнішні підпрограми не зможуть звернутися до властивостей а і b, тому доведеться передбачити методи, які їх встановлюють. У цих методах, крім установки значень властивостей, повинен проводитися перерахунок властивості с. Це буде гарантувати цілісність даних об'єкта при зміні властивостей а і b.

Зауважимо, що методи установки повинні мати широку область видимості, щоб до них можна було звернутися з будь-якого місця програми.

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

Unit UsingPrivatel; (Заголовок модуля)

Interface (Начало интерфейсной части)

Туре

ABC = class (Заголовок класу ABC)

private (Початок області видимості private}

a, b: Double; (Властивості а і b мають вузьку область видимості}

public (Початок області видимости public)

с: Double; (Властивість с має широку область видимості)

Procedure SetA(NewA: Double);

(Метод SetA має широку область видимості)

Procedure SetB(NewB: Double);

(Метод Set В має широку область видимості)

end;

Implementation (Початок описувальної частини)

Procedure ABC.SetA(NewA: Double);

(Опис метода. SetA класса ABC)

Begin

a:= NawA; (Установка значення свойства a}

c;= a * b; {Оновлення значення властивості c —

підтримання цілісності даних)

end;

Procedure ABC.SetB(NewB: Double);

(Опис метода SetB класса ABC)

Begin

b = NewB; (Установка значення властивості b)

c:= a * b; (Оновлення значення властивості c —

підтримання цілісності даних)

end;

end. (Закінчення модуля)

При такій конструкції класу викликає підпрограма не зможе змінити значення властивостей а і b, що не вплинувши тим самим на значення властивості с, тому цілісність даних не буде порушена. Однак властивість з доступно для зміни, навіть якщо його значення пересчіт-тано при установці значень а і b. У підсумку воно може змінитися, викликавши невідповідність даних. Таким чином, краще було б приховати властивість с, реалізувавши спеціальний метод доступу до його значення (лістинг 2.6).

Лістинг 2.6. Завдання областей видимості Другий підхід

Unit UsingPrivate2; (Заголовок модуля)

Interface (Початок інтерфейсної частини)

Туре

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

c:= a * Ь; (Оновлюємо значення властивості c)

Result:= c; (Повертаємо значення з викликаючою

підпрограмою)

end;

end. (Закінчення модуля)

При такій конструкції класу цілісність даних не може бути на-рушена викликають підпрограмами, якщо тільки вони не знаходяться в одному модулі з описуваним класом, тоб-то, в даному випадку, в модулі UsingPrivate2. Єдиним недоліком такого підходу є постійний перерахунок значення с при кожному зверненні до методу GetC. Тому найбільше оптимальним варіантом рішення нашої задачі буде приховування всіх властивостей класу і реалізація методів доступу до них через методи (див. лістинг 2.7).

Лістинг 2.7. Завдання областей видимості.

 

Третій підхід (оптимальний)

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

<== предыдущая лекция | следующая лекция ==>
Перевантажуємі методи | Property-властивості
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 450; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.018 сек.