Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 117
- Предыдущая
- 117/642
- Следующая
• определение пары открытых методов доступа и изменения;
• определение открытого свойства.
Независимо от выбранного приема идея заключается в том, что хорошо инкапсулированный класс должен защищать свои данные и скрывать подробности своего функционирования от любопытных глаз из внешнего мира. Это часто называют программированием в стиле черного ящика. Преимущество такого подхода в том, что объект может свободно изменять внутреннюю реализацию любого метода. Работа существующего кода, который использует данный метод, не нарушается при условии, что параметры и возвращаемые значения методов остаются неизменными.
Инкапсуляция с использованием традиционных методов доступа и изменения
В оставшейся части главы будет построен довольно полный класс, моделирующий обычного сотрудника. Для начала создайте новый проект консольного приложения под названием
EmployeeApp
Employee.cs
Employee
using 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); // текущая выплата
}
}
}
Обратите внимание, что поля класса
Employee
private
empName
empID
currPay
Employee emp = new Employee();
<b>// Ошибка! Невозможно напрямую обращаться к закрытым полям объекта!</b>
emp._empName = "Marv";
Если нужно, чтобы внешний мир взаимодействовал с полным именем сотрудника, то традиционный подход предусматривает определение методов доступа (метод
get
set
get
set
В целях иллюстрации давайте инкапсулируем поле
empName
Employee
SetName()
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
- Следующая