Инкапсуляция обеспечивает возможность сохранения целостности данных для состояния объекта. Вместо определения открытых полей (с помощью которых очень просто прийти к нарушению целостности данных), вашей привычкой должно стать определение
• Определение пары традиционных методов чтения и модификации данных.
• Определение именованного свойства.
Суть любого их этих подходов заключается в том, что хорошо инкапсулированный класс должен скрыть от "любопытных глаз внешнего мира" необработанные данные и детали того, как выполняются соответствующие действия. Часто такой подход называют
Инкапсуляция на основе методов чтения и модификации
Давайте снова вернемся к рассмотрению нашего класса Employee. Чтобы "внешний мир" мог взаимодействовать с частным полем данных fullName, традиции велят определить средства
// Традиционные средства чтения и модификации для приватных данных.
public class Employee {
private string fullName;
…
// Чтение.
public string GetFullName() {return fullName;}
// Модификация.
public void SetFullName(string n) {
// Удаление недопустимых символов (!, @, #, $, %)
// проверка максимальной длины (или регистра символов)
// перед присваиванием.
fullName = n;
}
}
Конечно, компилятору "все равно", что вы будете вызывать методы чтения и модификации данных. Поскольку GetFullName() и SetFullName() инкапсулируют приватную строку с именем fullName, выбор таких имен кажется вполне подходящим. Логина вызова может быть следующей.
// Использование средств чтения/модификации.
static void Main(string[] args) {
Employee p = new Employee();
p.SetFullName("Фред Флинстон");
Console.WriteLine("Имя работника: {0} ", p.GetFullName());
Console.ReadLine();
}
Инкапсуляция на основе свойств класса
В отличие от традиционных методов чтения и модификации, языки .NET тяготеют к реализации принципа инкапсуляции на основе использования
// Синтаксис установки/чтения значения ID работника.
static void Main(string[] args) {
Employee p = new Employee();
// Установка значения.
p.ID = 81;
// Чтение значения.
Console.WriteLine ("ID работника: {0} ", p.ID); Console.ReadLine();
}
Свойства типа "за кадром" всегда отображаются в "настоящие" методы чтения и модификации. Поэтому, как разработчик класса, вы имеете возможность реализовать любую внутреннюю логику, выполняемую перед присваиванием соответствующего значения (например, перевод символов в верхний регистр, очистку значения от недопустимых символов, проверку принадлежности числового значения диапазону допустимости и т.д.). Ниже демонстрируется синтаксис C#. использующий, кроме свойства ID, свойство Pay (оплата), которое инкапсулирует поле currPay, a также свойство Name (имя), которое инкапсулирует данные fullName.
// Инкапсуляция с помощью свойств.
public class Employee {
...
private int empID;
private float currPay;
private string fullName;
// Свойство для empID.
public int ID {
get {return empID;}
set {