Давайте вновь обратимся к нашему классу Employee. Если мы хотим, чтобы внешний мир смог работать с внутренними данными этого класса (пусть это будет только одна переменная fullName, для которой используется тип данных string), то традиционный подход рекомендует создание метода доступа (accessor, или get method) и метода изменения (mutator, или set method). Набор таких методов может выглядеть следующим образом:
// Определение традицонных методов доступа и изменения для закрытой переменной public class Employee
{
private string fullName:
....
// Метод доступа
public string GetFullName() {return fullName; }
// Метод изменения
public void SetFullName (string n)
{
// Логика для удаления неположенных символов (!. @. #. $. % и прочих
// Логика для проверки максимальной длины и прочего
fullName = n;
}
}
Такой подход требует наличия двух методов для взаимодействия с каждой из переменных. Вызов этих методов может выглядеть следующим образом:
// Применение методов доступа и изменения
public static int Main(string[ ] args)
{
Employee p = new Employee();
p.SetFullName(“Fred");
Console.WriteLine(“Employee is named: " + p.GetFullName());
|
|
}
Второй способ инкапсуляции: применение свойств класса
Помимо традиционных методов доступа и изменения для обращения к закрытым членам класса можно также использовать свойства (properties). В Visual Basic и СОМ свойства — это привычный инструмент. Свойства позволяют имитировать доступ к внутренним данным класса: при получении информации или внесении изменений через свойство синтаксис выглядит так же, как при обращении к обычной открытой переменной. Но на самом деле любое свойство состоит из двух скрытых внутренних методов. Преимущество свойств заключается в том, что вместо того, чтобы использовать два отдельных метода, пользователь класса может использовать единственное свойство, работая с ним так же, как и с открытой переменной-членом данного класса:
// Обращ ение к имени сотрудника через свойство
public static int Main(string[ ] args)
{
Employee p = new Employee();.
// Устанавливаем значение
p.EmpID = 81;
// Получаем значение
Console.WriteLine(“Person ID is: {0}", p.EmpID);
return 0;
}
Если заглянуть внутрь определения класса, то свойства всегда отображаются в «реальные» методы доступа и изменения. А уже в определении этих методов вы можете реализовать любую логику (например, для устранения лишних символов, проверки допустимости вводимых числовых значений и прочего). Ниже представлен синтаксис класса Employee с определением свойства EmpID:
// Пользовательское свойство EmpID для доступа к переменной empIDi
public class Employee
{
private int empID;
// Свойство для empID
public int EmpID
{