2. Съдържание
• Свойства
• Индексатори
• Капсулиране със свойства и индексатори
• Статични членове
• Статични полета
• Статични методи
• Статични конструктори
• Статични свойства
3. Свойства
• Какво е „свойство“?
– Вид член на клас
– Описва поведение на класа
– За външния код изглежда като характеристика
– Служи за изпълнение на операции при прочитането или
присвояването на стойност на характеристика на обект
– Заменя аксесорите и мутаторите при капсулиране на класа
– Може да се използва за реализиране на характеристика, която не
се съхранява в поле на обекта, а може да бъде изчислена
посредством други вътрешни данни на обекта
4. Свойства
• Деклариране на свойства
– Както повечето членове, свойствата имат видимост
– Тип данни
– Уникално наименование в рамките на класа
– Блок с операции, които да се изпълнят при прочитане на стойността
на свойството; задължително трябва да бъде върнат резултат от
указания тип
– Блок с операции, които да се изпълнят при присвояване на
стойност на свойството; присвоената стойност се достъпва члез
стандартната дума value, която играе ролята на параметър
– Един от двата блока може да бъде пропуснат: свойства само за
четене или свойства само за запис
5. Свойства
class Animal
{
// Частно поле за съхраняване на данните
private string _species;
// Свойство за капсулиране на данните
public string Species
{
// Блок за четене
get { return _species; }
// Блок за запис
set
{
if (!string.IsNullOrEmpty(value))
_species = value;
}
}
}
• Деклариране на свойства
– Модификатор за достъп
– Тип данни
– Наименование
– Блок, съдържащ get и/или set блок
– get блок:
• Ключова дума get
• Блок с операции, които да бъдат изпълнени
при прочитане на стойността на свойството
• Трябва да бъде върната стойност от подходящ
тип
– set блок:
• Ключова дума set
• Блок с операции, които да бъдат изпълнени
при присвояване на стойност на свойството
• Присвоената стойност се достъпва чрез
стандартната дума value
7. Свойства
Animal cat = new Animal();
// Присвояване на стойност на свойство
cat.Species = "Felis silvestris catus";
// Прочитане на стойността на свойство
Console.WriteLine(cat.Species);
// Присвояване на стойност при инстанциране
// на обект с инициализация
Animal dog = new Animal
{
Species = "Canis lupus familiaris",
};
• Употреба на свойства
– Стойността на свойство се достъпва по
същия начин, както и тази на поле
– Израз, рефериращ обекта
– Оператор за достъпване на член „.“
– Наименование на свойството
– Фундаменталната разлика е в това, че
съответната прочетена или присвоена
стойност не е задължително да се пази
в паметта на обекта
9. Свойства
class User
{
private string _userName;
private bool _isLocked;
// Свойство само за четене
public string UserName
{
get { return _userName; }
}
// Свойство само за запис
public bool IsLocked
{
set { _isLocked = value; }
}
}
• Деклариране на свойства само за
четене
– Декларира се само get блок
– Компилаторът не разрешава
присвояване на стойност на
свойството
• Деклариране на свойство само за
запис
– Декларира се само set блок
– Компилаторът не разрешава
прочитане на стойността на свойството
10. Свойства само за четене и свойства само за запис -
демо
// Демонстрация
11. Свойства
class Shape2D
{
private double _area;
public double Area
{
// Публичен достъп за четене
get { return _area; }
// Защитен достъп за запис
protected set
{
if (value > 0.0)
_area = value;
}
}
}
• Свойства с различна видимост на
get и set блоковете
– Пред един от get и set блоковете може
да се постави модификатор за достъп
– Видимостта на съответния блок трябва
да е по-ограничена от видимостта на
цялото свойство
13. Свойства
class Building
{
// Ръчно капсулирано със свойство поле
private double _height;
public double Height
{
get { return _height; }
set { _height = value; }
}
// Автоматично генерирано свойство
public double Area { get; set; }
// Автоматично генерирано свойство с
// различна видимост на блоковете
public bool IsDemolished { get;
private set; }
}
• Автоматично генерирани свойства
– Вместо get и set блокове се поставят
само двете ключови думи, следвани от
точки и запетаи
– Компилаторът автоматично създава
частно поле за съхранение на данните
за автоматично генерираното свойство
– Удобно, когато не е необходимо
специално поведение, освен
прочитане и записване на данните в
частно поле
– Възможно е да се укаже различна
видимост на get и set блоковете
15. Индексатори
• Какво е „индексатор“?
– Вид член на клас
– Описва поведение на класа
– Служи за достъпване на елемент по пореден номер или друг/и
параметър/ри, подобно на елементите на масив, чрез оператора
за индексиране на елемент []
– Удобен за реализиране на класове, които представляват колекции
от елементи
16. Индексатори
• Деклариране на индексатори
– Както повечето членове, индексаторите имат видимост
– Няма наименование
– Тип данни на елементите, които се индексират
– Списък от параметри (поне един)
– Блокове от операции за четене и/или записване на стойност на
съответния елемент – подобно на свойство
– В един клас може да се декларират няколко индексатора, стига те
да се различават по броя или типовете данни на параметрите си
(подобно на методите)
17. Индексатори
class Song
{
// ...
}
class Album
{
// Частно поле за съхранение на песните
private Song[] _songs;
// Индексатор за достъпване на песните
public Song this[int index]
{
// Блок за четене на елемент
get { return _songs[index - 1]; }
// Блок за записване на елемент
set { _songs[index - 1] = value; }
}
}
• Деклариране на индексатори
– Модификатор за достъп
– Тип данни на индексираните елементи
– Ключова дума this
– Списък от параметри, заградени в
квадратни скоби
– Блок, съдържащ get и/или set блок
– Както и при свойствата, get и set
блоковете може да са с различна
видимост
19. Индексатори
Album album = new Album(11)
{
Artist = "Pearl Jam",
Title = "Ten",
};
// Записване на елемент по индекс
album[1] = new Song
{
Title = "Once",
};
album[2] = new Song
{
Title = "Even Flow",
};
// Прочитане на елемент по индекс
Console.WriteLine(album[1].Title);
• Употреба на индексатори
– Индексатор на обект се използва със
същия синтаксис, както при
индексиране на елемент в масив
– Променлива или израз, който
реферира обекта-колекция
– Един или повече аргументи, заградени
в квадратни скоби
21. Капсулиране чрез свойства и индексатори
• Свойствата и индексаторите „обличат“ поведението на
обекта в по-удобни и по-интуитивни за употреба синтактични
конструкции
• Всичко, което може да се осъществи чрез свойство или
индексатор, може да бъде реализирано и чрез
обикновен(и) метод(и)
• Препоръчва се употребата на свойства и индексатори,
където е възможно/уместно
23. Статични членове
• Какво е „статичен член“ на клас/структура?
– Не е обвързан с конкретен екземпляр на типа данни ,в който е
деклариран
– Обвързан е със самия тип данни
– Достъпва се директно през типа данни
– Декларира се подобно на обикновен (екземплярен) член, но се
поставя ключовата дума static след модификатора за достъп
24. Статични полета
• Статични полета
– Съхраняват характеристики на класа, а не на конкретни негови
екземпляри
– За всяко статично поле се заделя единствено място в паметта,
обвързано със самия клас
– Константните полета са статични по подразбиране
– Често се използват за съхраняване на помощна информация, от
която се нуждаят екземплярите на класа
25. Статични полета
class Book
{
// Деклариране на статично поле за брой
// инстанцирани обекти от тип Book
public static int BookCount;
// Деклариране на статично поле за глобален
// масив от книги
public static Book[] Books = new Book[100];
}
• Деклариране на статични полета
– Модификатор за достъп
– Ключова дума static
– Тип данни
– Наименование (уникално измежду
всички членове на класа, независимо
дали са статични)
– Стойност по подразбиране
(незадължителна)
26. Статични полета
class Book
{
// ...
// Поле за номер на книга
private int _bookNumber;
// Екземплярен конструктор на класа
public Book()
{
// Генериране на номера на новата книга
_bookNumber = BookCount;
// Вкарване на книгата в глобалния масив
Books[BookCount] = this;
// Увеличаване на броя книги с 1
BookCount++;
}
}
// ...
// Достъпване на списъка с книги в главната програма
Book book = Book.Books[2];
• Използване на статични полета
– Наименование на класа, в който е
декларирано статичното поле
– Оператор за достъп на член „.“
– Наименование на статичното поле
– Могат да се достъпват директно в
декларациите както на статичните, така
и на екземплярните членове на класа
– Не могат да се достъпват през
екземпляр на класа (включително this)
28. Статични методи
• Статични методи
– Описват поведение, което не е обвързано с конкретен екземпляр
на класа
– Няма достъп до текущия екземпляр на класа (тъй като няма такъв) –
не може да се използва ключовата дума this, нито могат да се
достъпват пряко екземплярните членове на класа
– Могат да се достъпват пряко статичните членове на класа
– Много от стандартните методи, с които вече сте запознати, са
статични
– Главната програма на всяко приложение в C# на практика е
статичен метод
29. Статични методи
class Book
{
// ...
// Статичен метод за отстраняване на книга
// от глобалния масив
public static void RemoveBook(int index)
{
// Проверка за валиден индекс на книга
if (index < 0 || index >= BookCount)
return;
// Преместване на следващите книги назад
for (int i = index; i < BookCount - 1; i++)
{
Books[i] = Books[i + 1];
Books[i]._bookNumber--;
}
// Намаляване на броя книги с 1
BookCount--;
}
}
• Деклариране на статични методи
– Модификатор за достъп
– Ключова дума static
– Тип данни на връщания резултат (или
ключова дума void)
– Наименование
– Списък от параметри в кръгли скоби
– Блок с операции (тяло)
– В тялото не може да се използва ключовата
дума this, нито да се достъпват директно
екземплярни членове
– Могат да се достъпват директно статични
членове
– Могат да се декларират методи с еднакви
наименования и различни по брой или
типове параметри
30. Статични методи
class Book
{
// ...
// Екземплярен метод за премахване на текущата
// книга от глобалния масив
public void RemoveFromList()
{
RemoveBook(_bookNumber);
}
}
// Премахване на книги от списъка в главната програма
Book.Books[3].RemoveFromList();
Book.RemoveBook(0);
• Използване на статични методи
– Наименование на класа, в който е
декларирано статичният поле
– Оператор за достъп на член „.“
– Наименование на статичния метод
– Списък с аргументи в кръгли скоби
– Могат да се достъпват директно в
декларациите както на статичните, така
и на екземплярните членове на класа
– Не могат да се достъпват през
екземпляр на класа (включително this)
32. Статични конструктори
• Статични конструктори
– Описват поведение, което се изпълнява еднократно при
инициализацията на класа
– Удобни за инициализиране на статични полета
– Могат да се достъпват статичните членове на класа
– Програмистът не извиква статичните конструктори явно и няма
контрол кога точно да бъдат изпълнени
– Не приемат параметри
– Като правило се изпълняват непосредствено преди първата
употреба на съответния клас в програмата
33. Статични конструктори
class Book
{
// ...
// Статичен конструктор на класа
static Book()
{
BookCount = 0;
Books = new Book[100];
}
}
• Деклариране на статични
конструктори
– Не се поставя модификатор за достъп
– Ключова дума static
– Наименование на класа
– Празни кръгли скоби (празен списък с
параметри)
– Блок с операции (тяло)
– В тялото не може да се използва ключовата
дума this, нито да се достъпват директно
екземплярни членове
– Могат да се достъпват директно статични
членове
35. Статични свойства
• Статични свойства
– Представляват свойства, обвързани със самия клас, а не с
конкретен негов екземпляр
– Обвиват поведение, но за външния код се държат като статични
полета
– Удобни за обвиване на статични полета (например за отложено
зареждане на стойността на статично поле или за капсулирането
му)
– Налице са всички възможности на екземплярните свойства, с
описаните ограничения за статични методи
36. Статични свойства
class Book
{
// Частно статично поле за глобален масив от
// книги
private static Book[] _books = new Book[100];
// Публично свойство само за четене за
// глобален масив от книги
public static Book[] Books
{
get { return _books; }
}
// Автоматично генерирано статично свойство с
// публичен достъп за брой инстанцирани обекти
// от тип Book
public static int BookCount { get; private set; }
}
• Деклариране на статични свойства
– Модификатор за достъп
– Ключова дума static
– Тип данни
– Наименование
– Блок, съдържащ get и/или set блокове
– В блоковете не може да се използва
ключовата дума this, нито да се достъпват
директно екземплярни членове
– Могат да се достъпват директно статични
членове
– get и set блоковете може да имат различна
видимост, както при екземплярните
свойства
– Могат да се създават автоматично
генерирани статични свойства
37. Статични свойства
class Book
{
// ...
// Поле за номер на книга
private int _bookNumber;
// Екземплярен конструктор на класа
public Book()
{
// Генериране на номера на новата книга
_bookNumber = BookCount;
// Вкарване на книгата в глобалния масив
Books[BookCount] = this;
// Увеличаване на броя книги с 1
BookCount++;
}
}
// ...
// Достъпване на списъка с книги в главната програма
Book book = Book.Books[2];
• Използване на статични свойства
– Наименование на класа, в който е
декларирано статичното свойство
– Оператор за достъп на член „.“
– Наименование на статичното свойство
– Могат да се достъпват директно в
декларациите както на статичните, така
и на екземплярните членове на класа
– Не могат да се достъпват през
екземпляр на класа (включително this)
39. Задачи за упражнение
• Преработете програмите от предишните упражнения
(геометрични фигури, библиотека и походова конзолна
ролева игра), така че да се възползвате от новите
възможности на езика, за които научихте:
– Използвайте свойства и индексатори вместо методи, където е
уместно, за да капсулирате обектите
– Създайте статични методи за въвеждане на нов екземпляр на
съответния клас от клавиатурата
– Възползвайте се от статичните полета, конструктори и свойства, за
да споделите информация между отделните екземпляри на един
клас (например екземпляр на класа Random)
– Изнесете поведението, което не е обвързано с конкретен
екземпляр на класа, в статични методи