// Методы.
public void GiveBonus(float amount) => Pay += amount;
public void DisplayStats()
{
Console.WriteLine("Name: {0}", Name); // имя сотрудника
Console.WriteLine("ID: {0}", Id);
// идентификационный номер сотрудника
Console.WriteLine("Age: {0}", Age); // возраст сотрудника
Console.WriteLine("Pay: {0}", Pay); // текущая выплата
}
// Свойства остаются прежними...
...
}
Свойства, допускающие только чтение
При инкапсуляции данных может возникнуть желание сконфигурировать
set
. Например, пусть имеется новое свойство по имени SocialSecurityNumber
, которое инкапсулирует закрытую строковую переменную empSSN
. Вот как превратить его в свойство, доступное только для чтения:public string SocialSecurityNumber
{
get { return _empSSN; }
}
Свойства, которые имеют только метод get
public string SocialSecurityNumber => _empSSN;
Теперь предположим, что конструктор класса принимает новый параметр, который дает возможность указывать в вызывающем коде номер карточки социального страхования для объекта, представляющего сотрудника. Поскольку свойство SocialSecurityNumber
public Employee(string name, int age, int id, float pay, string ssn)
{
Name = name;
Age = age;
ID = id;
Pay = pay;
// Если свойство предназначено только для чтения, это больше невозможно!
SocialSecurityNumber = ssn;
}
Если только вы не готовы переделать данное свойство в поддерживающее чтение и запись (что вскоре будет сделано), тогда единственным вариантом со свойствами, допускающими только чтение, будет применение лежащей в основе переменной-члена empSSN
public Employee(string name, int age, int id, float pay, string ssn)
{
...
// Проверить надлежащим образом входной параметр ssn
// и затем установить значение.
empSSN = ssn;
}
Свойства, допускающие только запись
Если вы хотите сконфигурировать
get
, например:public int Id
{
set { _empId = value; }
}
Смешивание закрытых и открытых методов get/set в свойствах
При определении свойств уровень доступа для методов get
set
может быть разным. Возвращаясь к номеру карточки социального страхования, если цель заключается в том, чтобы предотвратить модификацию номера get
как открытый, но метод set
— как закрытый:public string SocialSecurityNumber
{
get => _empSSN;
private set => _empSSN = value;
}
Обратите внимание, что это превращает свойство, допускающее только чтение, в допускающее чтение и запись. Отличие в том, что запись скрыта от чего-либо за рамками определяющего класса.
Еще раз о ключевом слове static: определение статических свойств
Ранее в главе рассказывалось о роли ключевого слова static
StaticDataAndMembers
класс SavingsAccount
имел два открытых статических метода для получения и установки процентной ставки. Однако более стандартный подход предусматривает помещение такого элемента данных в статическое свойство. Ниже приведен пример (обратите внимание на применение ключевого слова static
):// Простой класс депозитного счета.
class SavingsAccount
{
// Данные уровня экземпляра.
public double currBalance;
// Статический элемент данных.