Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

emp2.SetName("Xena the warrior princess");

Console.ReadLine;

Пока все идет хорошо. Мы инкапсулировали закрытое поле

empName
с использованием двух открытых методов с именами
GetName
и
SetName
. Для дальнейшей инкапсуляции данных в классе
Employee
понадобится добавить разнообразные дополнительные методы (такие как
GetID
,
SetID
,
GetCurrentPay
,
SetCurrentPay
). В каждом методе, изменяющем
данные, может содержаться несколько строк кода, в которых реализована проверка дополнительных бизнес-правил. Несмотря на то что это определенно достижимо, для инкапсуляции данных класса в языке C# имеется удобная альтернативная система записи.

Инкапсуляция с использованием свойств

Хотя инкапсулировать поля данных можно с применением традиционной пары методов

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
рейтинг книги
Шайтан Иван 2

Наследник старого рода

Шелег Дмитрий Витальевич
1. Живой лёд
Фантастика:
фэнтези
8.19
рейтинг книги
Наследник старого рода

Аргумент барона Бронина 2

Ковальчук Олег Валентинович
2. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 2

Третье правило дворянина

Герда Александр
3. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Третье правило дворянина

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

СД. Том 15

Клеванский Кирилл Сергеевич
15. Сердце дракона
Фантастика:
героическая фантастика
боевая фантастика
6.14
рейтинг книги
СД. Том 15

Жена неверного маршала, или Пиццерия попаданки

Удалова Юлия
Любовные романы:
любовно-фантастические романы
4.25
рейтинг книги
Жена неверного маршала, или Пиццерия попаданки

Мымра!

Фад Диана
1. Мымрики
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Мымра!

Идеальный мир для Лекаря 12

Сапфир Олег
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 12

Оцифрованный. Том 1

Дорничев Дмитрий
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Оцифрованный. Том 1

Элита элит

Злотников Роман Валерьевич
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Элита элит

Хуррит

Рави Ивар
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Хуррит

Шаман. Похищенные

Калбазов Константин Георгиевич
1. Шаман
Фантастика:
боевая фантастика
попаданцы
6.44
рейтинг книги
Шаман. Похищенные

Курсант: Назад в СССР 4

Дамиров Рафаэль
4. Курсант
Фантастика:
попаданцы
альтернативная история
7.76
рейтинг книги
Курсант: Назад в СССР 4