Поиск

Свойства как "умные" поля

Всегда поощряется создание классов, которые не только скрывают реализацию своих методов, но и запрещают членам любой прямой доступ к полям класса. Обеспечить корректную работу с полем можно, предоставляя методы-аксессоры (accessor methods), выполняющие работу по получению и установке значений этих полей, так чтобы они действовали согласно правилам конкретной предметной области.

Допустим, у вас есть класс "Адрес" с полями для почтового индекса и города. Когда клиент модифицирует поле индекса Address.ZipCode, вам нужно сверить введенный код с БД и автоматически установить значение поля Address. City в зависимости от этого почтового индекса. Если бы у клиента был прямой доступ к открытому члену (public) Address.ZipCode, выполнить обе эти задачи было бы сложно, поскольку для непосредственного изменения открытого члена метод не требуется. Поэтому вместо того, чтобы предоставить доступ к полю Address.ZipCode, лучше определить поля Address.ZipCode и Address.City как protected и предоставить методы-аксессоры для получения и установки значения поля Address.Zip-Code. Таким образом, вы можете добавить код, выполняющий дополнительную работу при изменении поля.

Этот пример с почтовым индексом можно запрограммировать на С# следующим образом. Заметьте: поле 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();