Язык программирования C#9 и платформа .NET5
Шрифт:
emp2.SetName("Xena the warrior princess");
Console.ReadLine;
Пока все идет хорошо. Мы инкапсулировали закрытое поле
empName
с использованием двух открытых методов с именами GetName
и SetName
. Для дальнейшей инкапсуляции данных в классе Employee
понадобится добавить разнообразные дополнительные методы (такие как GetID
, SetID
, GetCurrentPay
, SetCurrentPay
). В каждом методе, изменяющем
Инкапсуляция с использованием свойств
Хотя инкапсулировать поля данных можно с применением традиционной пары методов
get
и set
, в языках .NET Core предпочтение отдается обеспечению инкапсуляции данных с использованием свойств. Прежде всего, имейте в виду, что свойства — всего лишь контейнер для "настоящих" методов доступа и изменения, именуемых get
и set
соответственно. Следовательно, проектировщик класса по-прежнему может выполнить любую внутреннюю логику перед присваиванием значения (например, преобразовать в верхний регистр, избавиться от недопустимых символов, проверить вхождение внутрь границ и т.д.). Ниже приведен измененный код класса
Employee
, который теперь обеспечивает инкапсуляцию каждого поля с использованием синтаксиса свойств вместо традиционных методов get
и set
.
class Employee
{
// Поля данных.
private string _empName;
private int _empId;
private float _currPay;
// Свойства!
public string Name
{
get { return _empName; }
set
{
if (value.Length > 15)
{
Console.WriteLine("Error! Name length exceeds 15 characters!");
// Ошибка! Длина имени превышает 15 символов!
}
else
{
_empName = value;
}
}
}
// Можно было бы добавить дополнительные бизнес-правила для установки
// данных свойств, но в настоящем примере в этом нет необходимости.
public int Id
{
get { return _empId; }
set { _empId = value; }
}
public float Pay
{
get { return _currPay; }
set { _currPay = value; }
}
...
}
Свойство C#
get
(метод доступа) и set
(метод изменения) прямо внутри самого свойства. Обратите внимание, что свойство указывает тип инкапсулируемых им данных способом, который выглядит как возвращаемое значение. Кроме того, в отличие от метода при определении свойства не применяются круглые скобки (даже пустые). Взгляните на следующий комментарий к текущему свойству Id
:
// int представляет тип данных, инкапсулируемых этим свойством.
public int Id // Обратите внимание на отсутствие круглых скобок.
{
get { return _empId; }
set { _empID = value; }
}
В области видимости
set
свойства используется лексема value
, которая представляет входное значение, присваиваемое свойству вызывающим кодом. Лексема value
не является настоящим ключевым словом С#, а представляет собой то, что называется контекстным ключевым словом. Когда лексема value
находится внутри области set
, она всегда обозначает значение, присваиваемое вызывающим кодом, и всегда имеет тип, совпадающий с типом самого свойства. Таким образом, вот как свойство Name
может проверить допустимую длину строки:
public string Name
{
get { return _empName; }
set
{
// Здесь value на самом деле имеет тип string.
if (value.Length > 15)
{ Console.WriteLine("Error! Name length exceeds 15 characters!");
// Ошибка! Длина имени превышает 15 символов!
}
else
{
empName = value;
}
}
}
После определения свойств подобного рода вызывающему коду кажется, что он имеет дело с открытым элементом данных однако "за кулисами" при каждом обращении к ним вызывается корректный блок
get
или set
, предохраняя инкапсуляцию:
Console.WriteLine("***** Fun with Encapsulation *****\n");
Поделиться:
Популярные книги
Шайтан Иван 2
2. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Наследник старого рода
1. Живой лёд
Фантастика:
фэнтези
8.19
рейтинг книги
Аргумент барона Бронина 2
2. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Третье правило дворянина
3. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Убивать чтобы жить 3
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
СД. Том 15
15. Сердце дракона
Фантастика:
героическая фантастика
боевая фантастика
6.14
рейтинг книги
Жена неверного маршала, или Пиццерия попаданки
Любовные романы:
любовно-фантастические романы
4.25
рейтинг книги
Мымра!
1. Мымрики
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Идеальный мир для Лекаря 12
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Оцифрованный. Том 1
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Элита элит
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Хуррит
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Шаман. Похищенные
1. Шаман
Фантастика:
боевая фантастика
попаданцы
6.44
рейтинг книги
Курсант: Назад в СССР 4
4. Курсант
Фантастика:
попаданцы
альтернативная история
7.76