
- •Ключове слово this
- •Ключове слово static
- •Статичний конструктор
- •Інкапсуляція з використанням методів get і set
- •Інкапсуляція з використанням властивостей
- •Організація робіт при описі класу. Атрибут partial
- •Спадкоємство
- •Int point; // поле
- •Додавання до класу запечатаного класу
- •Вкладеність класів
- •Поліморфізм
- •Абстрактні класи
- •Приховування членів класу
- •Оператори as і is
- •Структури
Інкапсуляція з використанням методів get і set
Побудуємо клас Employee, який моделює співробітника деякого підприємства. Спочатку визначимо в ньому поле "Ім'я співробітника". Ми хочемо, щоб поза класом до цього поля не було доступу. Тобто це поле повинно мати атрибут доступу private. Вигляд оголошення в класі буде private string empName; (ім'я - рядкове дане, тобто дане типу string). Щоб прочитати це дане з класу, треба створити метод, який мав би право читати це дане і виводив би його значення. Починатися він повинен з частини Get (отримати). Тобто його ім'я буде, наприклад, GetName(). Який атрибут доступу йому присвоїти? Цей метод викликатиметься з програми, яка буде виконуватися, а не в самому класі. Тому він повинен бути відомий у виконуючій програмі, тобто бути загальнодоступним, не захованим в класі. Значить, його атрибут доступу - public. Він повинен повертати ім'я співробітника. Отже тип значення, яке повертається, у методу буде string (як і тип імені співробітника). Остаточно метод читання поля empName виглядатиме так:
public string GetName()
{
return empName;
}
Нагадаємо, що return - це оператор повернення результату роботи функції (тут - методу класу). Тому у виконуючій програмі звернення до методу можна було б записати, наприклад, так:
string s = GetName();
якби все відбувалося не з членом класу. Але при роботі з класом заздалегідь треба створити з класу об'єкт стосовно конкретного співробітника (тобто деякій змінній emp присвоїти тип класу Employee). Отже попередній запис насправді виглядатиме наступним чином:
Employee emp = new Employee("Іванов І.І.", решта аргументів конструктора);
string s = emp.GetName();
В s з'явиться "Іванов І.І.".
Тепер треба створити метод, який змінює поле із зовнішньої програми. Назвемо його SetName() (встановити значення поля Name). Тут треба подумати, які дії треба заздалегідь виконати в тілі цього методу, перш ніж змінити поле. Ми візьмемо найпростішу дію: перевіримо значення, яке присвоюється полю, на його довжину. Хай, наприклад, ім'я працівника не повинне перевищувати дев'яти символів. Ось таку перевірку і задамо в методі. Зрозуміло, що метод повинен бути загальнодоступним, тобто повинен бути забезпечений атрибутом public. Повертати оператору return нічого не потрібно, тому метод має тип повернутого значення void. А у себе на вході метод повинен мати параметр типу string, бо він повинен приймати якийсь рядок тексту, яким замінить значення поля в класі. Таким чином метод може мати вигляд:
public void SetName(string Name)
{
if(Name.Length > 9)
Writeline("Помилка: довжина імені більше 9 ");
else
empName = Name;
}
Припускається, що метод знаходиться в класі, тому для нього змінна empName доступна.
У результаті для задання одного поля класу Employee у відповідності з принципом інкапсуляції отримаємо програму, представлену в лістингу 8.2.
Лістинг 8.2
// У результаті для задання одного поля класу Employee у відповідності з
// принципом інкапсуляції отримаємо програму, представлену в лістингу 8.2.
using System;
namespace app23_set_get
{
class Employee
{
private string empName; // поле
// Конструктор: повинен мати атрибут public інакше
// його не можна буде викликати з основної програми
public Employee(string name)
{
empName=name;
}
// Методи класу:
public string GetName()
{
return empName;
}
public int SetName(string Name)
{
if(Name.Length > 9)
{
Console.WriteLine("Помилка: довжина імені " +
"більше 9, ім'я = {0}", Name);
return(0);
}
else
{
empName = Name;
return(1);
}
} // if
} // кінець класу
class Program
{
public static void Main()
{
// Створюємо об'єкт з класу:
Employee emp = new Employee("Іванов І.І.");
// Отримуємо поле name з об'єкта (якби поле мало
// атрибут static, ми б його дістали прямо з класу):
string s=emp.GetName();
Console.WriteLine("Поле name = {0}", s);
Console.Write("Продовжити: <Enter> >");
// Змінюємо значення поля name:
if(emp.SetName("Петров П.П.") == 0)
emp.SetName("Петров П.");
// Так, як вище, не роблять, але це просто для прикладу
s=emp.GetName();
Console.WriteLine("Поле name = {0}", s);
Console.Write("Продовжити: <Enter> >");
Console.ReadKey(true);
}
}
}
Результат роботи програми представлений на рис. 8.3.
Рис. 8.3. Застосування методів get, set для управління полем класу