|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Механізми зміни доступу до полів. Методи-властивостіМетоди, називані властивостями (Propertіes), представляють спеціальну синтаксичну конструкцію, призначену для забезпечення ефективної роботи з властивостями. Правильною стратегією є закриття полів від клієнта – поля з'являються з модифікатором protected або prіvate. Клієнти класу не повинні використовувати інформацію про те, як улаштовані поля. Це полегшує можливу модифікацію класу в майбутньому. Клас зможе змінити представлення даних, зберігши інтерфейс, наданий клієнтам. У цьому випадку зміни в полях не відіб'ються на клієнтах. Закриття полів не означає, що клієнти класу не можуть працювати з даними, що зберігаються в полях класу. Можливі різні стратегії доступу клієнта до закритих полів класу: п'ять найбільш уживаних стратегій [3]: - читання, запис (Read, Wrіte); - читання, запис при першому звертанні (Read, Wrіte-once); - тільки читання (Read-only); - тільки запис (Wrіte-only); - ні читання, ні запис (Not Read, Not Wrіte). Забезпечуючи інкапсуляцію, необхідно мати можливість використовувати значення полів класу, для цього можна застосувати механізм використання методів-властивостей. Розглянемо загальний синтаксис методів-властивостей. Нехай name – це закрита властивість. Тоді для неї можна визначити відкритий метод-властивість (функцію), що повертає той же тип, що і поле name. Ім'я методу зазвичай близько до імені поля, відрізняючись від нього, наприклад, тільки заголовною буквою (Name). Тіло властивості містить два методи – get і set, один із яких може бути опущений. Метод get повертає значення закритого поля, метод set установлює значення, використовуючи значення, передане йому в момент виклику і збережене в службовій перемінній зі стандартним ім'ям value. Оскільки get і set – це звичайні процедури мови, програмно можна реалізувати як завгодно складні стратегії доступу. Практичний приклад створення методів-властивостей: розглянемо клас Person, у якого п'ять полів: fam, status, salary, age, health, що характеризують, відповідно, прізвище, статус, зарплату, вік і здоров'я персони. Усі поля закриті для клієнта, так що клієнт не може безпосередньо читати або записувати дані в поля класу. Для кожного з цих полів може бути створена своя стратегія доступу. При проектуванні класу будемо припускати, що вік доступний для читання і запису, прізвище можна задати тільки один раз, статус можна тільки читати, зарплата недоступна для читання, а здоров'я закрите для доступу і тільки спеціальні методи класу можуть повідомляти деяку інформацію про здоров'я персони. От як на C # можна забезпечити ці стратегії доступу до закритих полів класу:
public class Person { public enum Status { дитина, школяр, студент, працівник, пенсіонер } // поля (всі закриті) string fam = "", health = ""; int age = 0, salary = 0; Status status = Status.працівник; // методи - властивості ///стратегія: Read,Write-once (Читання, запис при першому зверненні) public string Fam { set { if (fam == "") fam = value; } get { return (fam); } } ///стратегія: Read-only(Тільки читання) public Status GetStatus { get { return (status); } } ///стратегія: Read,Write (Читання, запис) public int Age { set { age = value; // зміна статусу if (age < 7) status = Status.дитина; else if (age < 17) status = Status.школяр; else if (age < 22) status = Status.студент; else if (age < 65) status = Status.робітник; else status = Status.пенсіонер; } get { return (age); } } ///стратегия: Write-only (Тільки запис) public int Salary { set { salary = value; } } } Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |