Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 117
- Предыдущая
- 117/642
- Следующая
• определение пары открытых методов доступа и изменения;
• определение открытого свойства.
Независимо от выбранного приема идея заключается в том, что хорошо инкапсулированный класс должен защищать свои данные и скрывать подробности своего функционирования от любопытных глаз из внешнего мира. Это часто называют программированием в стиле черного ящика. Преимущество такого подхода в том, что объект может свободно изменять внутреннюю реализацию любого метода. Работа существующего кода, который использует данный метод, не нарушается при условии, что параметры и возвращаемые значения методов остаются неизменными.
Инкапсуляция с использованием традиционных методов доступа и изменения
В оставшейся части главы будет построен довольно полный класс, моделирующий обычного сотрудника. Для начала создайте новый проект консольного приложения под названием
EmployeeAppEmployee.csEmployeeusing System;namespace EmployeeApp{ class Employee {<b> // Поля данных.</b> private string _empName; private int _empId; private float _currPay;<b> // Конструкторы.</b> public Employee() {} public Employee(string name, int id, float pay) { _empName = name; _empId = id; _currPay = pay; }<b> // Методы.</b> public void GiveBonus(float amount) => _currPay += amount; public void DisplayStats() { Console.WriteLine("Name: {0}", _empName); // имя сотрудника Console.WriteLine("ID: {0}", _empId); // идентификационный // номер сотрудника Console.WriteLine("Pay: {0}", _currPay); // текущая выплата } }}Обратите внимание, что поля класса
EmployeeprivateempNameempIDcurrPayEmployee emp = new Employee();<b>// Ошибка! Невозможно напрямую обращаться к закрытым полям объекта!</b>emp._empName = "Marv";Если нужно, чтобы внешний мир взаимодействовал с полным именем сотрудника, то традиционный подход предусматривает определение методов доступа (метод
getsetgetsetВ целях иллюстрации давайте инкапсулируем поле
empNameEmployeeSetName()empNameНа заметку! В случае класса производственного уровня проверку длины строки с именем сотрудника следовало бы предусмотреть также и внутри логики конструктора. Мы пока проигнорируем указанную деталь, но улучшим код позже, во время исследования синтаксиса свойств.
class Employee{ // Поля данных. private string _empName; ...<b> // Метод доступа (метод get).</b> public string GetName() => _empName;<b> // Метод изменения (метод set).</b> public void SetName(string name) { // Перед присваиванием проверить входное значение. if (name.Length > 15) { Console.WriteLine("Error! Name length exceeds 15 characters!"); // Ошибка! Длина имени превышает 15 символов! } else { _empName = name; } }}Такой подход требует наличия двух уникально именованных методов для управления единственным элементом данных. Чтобы протестировать новые методы, модифицируйте свой код следующим образом:
Console.WriteLine("***** Fun with Encapsulation *****\n");- Предыдущая
- 117/642
- Следующая
