Читайте также:
|
|
Методи, називані властивостями (Propertіes), представляють спеціальну синтаксичну конструкцію, призначену для забезпечення ефективної роботи з властивостями. Правильною стратегією є закриття полів від клієнта – поля з'являються з модифікатором protected або prіvate. Клієнти класу не повинні використовувати інформацію про те, як улаштовані поля. Це полегшує можливу модифікацію класу в майбутньому. Клас зможе змінити представлення даних, зберігши інтерфейс, наданий клієнтам. У цьому випадку зміни в полях не відіб'ються на клієнтах.
Закриття полів не означає, що клієнти класу не можуть працювати з даними, що зберігаються в полях класу. Можливі різні стратегії доступу клієнта до закритих полів класу: п'ять найбільш уживаних стратегій:
-читання, запис (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# можна забезпечити ці стратегії доступу до закритих полів класу (Лістинг 4.1):
Лістинг 4.1:
public class Person
{
public enum Status
{ ребенок, школьник, студент, работник, пенсионер
}
//поля (все закрыты)
string fam = "", health = "";
int age = 0, salary = 0;
Status status = Status.работник;
//методы - свойства
/// <summary>
///стратегия: Read,Write-once (Чтение, запись при первом обращении)
/// </summary>
public string Fam
{
set { if (fam == "") fam = value; }
get { return (fam); }
}
/// <summary>
///стратегия: Read-only(Только чтение)
/// </summary>
public Status GetStatus
{
get { return (status); }
}
/// <summary>
///стратегия: Read,Write (Чтение, запись)
/// </summary>
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); }
}
/// <summary>
///стратегия: Write-only (Только запись)
/// </summary>
public int Salary
{
set { salary = value; }
}
}
Дата добавления: 2015-08-18; просмотров: 122 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Класи. Ролі класу | | | Доступ до методів |