1.5. Властивості
Властивості служать для організації доступу до полів класу. Як правило, властивість пов'язана із закритим полем класу й визначає методи його одержання й установки.
Синтаксис властивості:
[ атрибути ] [ специфікатори ] тип <ім'я властивості>
{
[ get код доступу ]
[ set код_доступу ]
}
Значення специфікаторів для властивостей і методів аналогічні. Найчастіше властивості оголошуються як відкриті (зі специфікатором public), оскільки вони входять в інтерфейс об'єкта.
Код доступу являє собою блоки операторів, які виконуються при одержанні (get) або установці ( set ) властивості. Може бути відсутнім або частина get, або set, але не обидві одночасно. Якщо відсутня частина set, властивість доступно тільки для читання (read-only), якщо відсутня частина get, властивість доступно тільки для запису (write-only).
Приклад 3. Опис властивостей.
public class Button : Control
{
private string caption; // закрите поле, з яким зв'язана властивість
public string Caption // властивість
{
get // спосіб одержання властивості
{
return caption;
}
set // спосіб встановлення властивості
{
if (caption != value)
{
caption = value;
}
}
}
}
При звертанні до властивості автоматично викликаються зазначені в ньому методи читання й встановлення. Синтаксично читання й запис властивості виглядають майже як методи. Метод get повинен містити оператор return, що повертає вираз, для типу якого повинне існувати неявне перетворення до типу властивості. У методі set використається параметр зі стандартним ім'ям value, що містить встановлюване значення.
Загалом, властивість може й не зв'язуватися з полем. Фактично, воно описує один або два методи, які здійснюють деякі дії над даними того ж типу, що й властивість. На відміну від відкритих полів, властивості забезпечують поділ між внутрішнім станом об'єкта і його інтерфейсом й, таким чином, спрощують внесення змін у клас.
1.6. Індексатори
Індексатор являє собою різновид властивості. Якщо в класі є сховане поле, що представляє собою масив, то за допомогою індексатора можна звернутися до елемента цього масиву, використовуючи ім'я об'єкта й номер елемента масиву у квадратних дужках. Іншими словами, індексатор - це такий «розумний» індекс для об'єктів.
Синтаксис індексатора аналогічний синтаксису властивості:
специфікатори тип this [ список_параметрів ]
get код доступу
set код доступу
Специфікатори аналогічні специфікаторам властивостей і методів. Список параметрів містить одне або кілька описів індексів, по яких виконується доступ до елемента. Найчастіше використається один індекс цілого типу. Індексатори в основному застосовуються для створення спеціалізованих масивів, на роботу з якими накладаються які-небудь обмеження. У прикладі 4 створений клас-масив, елементи якого повинні перебувати в діапазоні [0,100]. Крім того, при доступі до елемента перевіряється, чи не вийшов індекс за припустимі границі.
Приклад 4. Використання індексаторів
class Vector
{
private int hIndex;
private int nIndex;
private int kIndex;
public int[] vector;
public Vector(int Index, int StartIndex, int konecIndex)// конструктор классу
{
hIndex = Index;
nIndex = StartIndex;
kIndex = konecIndex;
vector = new int[Index];
for (int i = 0; i < Index; i++) vector[i] = i;
}
public int StartIndex
{
//код доступу
get { return nIndex; }
set { nIndex = value; }
}
public int konecIndex
{
//код доступу
get { return kIndex; }
set { kIndex = value; }
}
public int Index
{
get { return hIndex; }
}
public int this[int NumOfElement]// індексатор
{
get
{
if (NumOfElement >=0 && NumOfElement < hIndex)
{
return vector[NumOfElement];
}
else
throw new IndexOutOfRangeException();// виключення
}
set
{
if (NumOfElement >=0 && NumOfElement < hIndex &&
value >= 0 && value <= 100)
{
vector[NumOfElement] = value;
}
else
throw new IndexOutOfRangeException();
}
}
}
Видно, що індексатори описуються аналогічно властивостям. Завдяки застосуванню індексаторів з об'єктом, що містить у собі масив, можна працювати так само, як зі звичайним масивом. Якщо звертання до об'єкта зустрічається в лівій частині оператора присвоювання (оператор 1), автоматично викликається метод get. Якщо звернення виконується в складі виразу (оператор 2), викликається метод set.