КАТЕГОРИИ: Архитектура-(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
Стандартний опис класу містить властивості і методу, розташований-ні в порядку зростання їх видимості, але це правило не є обов'язковим. Туре <Ім’я класу> = 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; {Заголовок модуля)
Дата добавления: 2014-01-04; Просмотров: 478; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |