Принципы объектно-ориентированного программирования

         

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



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

Всегда поощряется создание классов, которые не только скрывают реализацию своих методов, но и запрещают членам любой прямой доступ к полям класса. Обеспечить корректную работу с полем можно, предоставляя методы-аксессоры (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();

 

Содержание раздела