Скачиваний:
29
Добавлен:
26.03.2016
Размер:
429.43 Кб
Скачать

Інкапсуляція з використанням методів 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 для управління полем класу