Всегда поощряется создание классов, которые не только скрывают реализацию своих методов, но и запрещают членам любой прямой доступ к полям класса. Обеспечить корректную работу с полем можно, предоставляя
методы-аксессоры
(accessor methods), выполняющие работу по получению и установке значений этих полей, так чтобы они действовали согласно правилам конкретной предметной области.
Допустим, у вас есть класс "Адрес" с полями для почтового индекса и города. Когда клиент модифицирует поле индекса
Address.ZipCode,
вам нужно сверить введенный код с БД и автоматически установить значение поля
Address. City
в зависимости от этого почтового индекса. Если бы у клиента был прямой доступ к открытому члену
(public) Address.ZipCode,
выполнить обе эти задачи было бы сложно, поскольку для непосредственного изменения открытого члена метод не требуется. Поэтому вместо того, чтобы предоставить доступ к полю
Address.ZipCode,
лучше определить поля
Этот пример с почтовым индексом можно запрограммировать на С# следующим образом. Заметьте: поле
ZipCode
определено как
protected
и поэтому недоступно клиенту, а методы-аксессоры
GetZipCode
и
SetZipCode
определены
как public.
class Address
{
protected string ZipCode; protected string City;
public string GetZipCodeQ {
return this.ZipCode;
>
public void SetZipCode(string ZipCode)
{
// Сверить почтовый индекс с базой данных.
this.ZipCode = ZipCode;
// Обновить this.City no результатам проверки почтового
// кода. } }
Клиент будет обращаться к значению
Address.ZipCode
примерно так:
Address addr = new AddressQ; addr.SetZipCode("55555"); string zip = addr.GetZipCode();