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

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: