понедельник, 12 марта 2018 г.

класи

Класи: основні поняття, дані, методи, конструктори, властивості

класи

Основні поняття
Клас - це узагальнене поняття, що визначають характеристики і поведінку деякого безлічі об'єктів, званих екземплярами класу. "Класичний" клас містить дані, що визначаютьвластивості об'єктів класу , і методи, що визначають їх поведінку. Для Windows-додатків в клас додається третя складова - події, на які можереагувати об'єкт класу. Всі класи бібліотеки .Net, а також всі класи, які створює програміст в середовищі .Net, мають одного загального предка - клас object .
Всі програми, розглянуті раніше, складалися з одного класу з одним методом Main і декількома допоміжними статичними методами. Тепер розглянемо поняття "клас" більш детально.
Опис класу містить ключове слово class, за яким слід його ім'я , а далі в фігурних дужках - тіло класу. Крім того, для класу можна задати його базові класи (предки) і ряд необов'язкових атрибутів і специфікаторів, що визначають різні характеристики класу:
[Атрибути] [специфікатор] class ім'я_класу [: предки] 
{Тело_класса}
Найпростіший приклад класу:
class Demo {}
Специфікатори визначають властивості класу, а також доступність класу для інших елементів програми. Можливі значення специфікаторів перераховані в наступній таблиці:
специфікаторопис
1newЗадає новий опис класу замість успадкованого від предка. Використовується для вкладення класів (в ієрархії об'єктів).
2publicДоступ до класу не обмежений
3protectedДоступ тільки з даного або похідного класу. Використовується для вкладених класів.
4internalДоступ лише з даної програми (збірки).
5protected internalДоступ тільки з даного та похідного класу і з даної програми (збірки).
6privateДоступ лише з елементів класу, всередині яких описаний даний клас. Використовується для вкладених класів.
7staticСтатичний клас. Дозволяє звертатися до методів класу без створення екземпляра класу
8sealedБезплідний клас. Забороняє успадкування даного класу. Застосовується в ієрархії об'єктів.
9abstractАбстрактний клас. Застосовується в ієрархії об'єктів.
Специфікатори 2-6 називаються специфікаторами доступу . Вони визначають, звідки можна безпосередньо звертатися до даного класу. Специфікатори доступу можуть комбінуватися з іншими специфікаторами.
Зауваження . Атрибути будуть розглянуті пізніше.
Клас можна описувати безпосередньо всередині простору імен або всередині іншого класу. В останньому випадку клас називається вкладеним. Залежно від місця опису класу деякі з цих специфікаторів можуть бути заборонені. В даному розділі ми розглянемо класи, які описуються безпосередньо в просторі імен. Для таких класів допускаються тільки два специфікатор: public і internal . За замовчуванням, тобто якщо жоден специфікатор доступу не вказано, мається на увазі специфікатор internal .
Об'єкти створюються явним або неявним чином, тобто або програмістом, або системою. Програміст створює екземпляр класу за допомогою операції new, наприклад:
Demo a = new Demo (); // Створюється екземпляр класу Demo
Якщо достатній для зберігання об'єкта обсяг пам'яті виділити не вдалося, то генерується виключення OutOfMemoryException .
Для кожного об'єкта при його створенні в пам'яті виділяється окрема область, в якій зберігаються його дані. У класі можуть бути присутнімистатичні елементи , які існують в єдиному екземплярі для всіх об'єктів класу. Статичні дані часто називають даними класу, а решта - даними примірника. Для роботи з даними класу використовуються статичні методи класу, для роботи з даними примірника -методи примірника , або просто методи.
До сих пір ми використовували в програмах тільки дані (змінні і константи) і методи. У загальному випадку клас може містити наступні функціональні елементи:
  1. Дані: змінні або константи.
  2. Методи, що реалізують не тільки обчислення, а й інші дії, що виконуються класом або його примірником.
  3. Конструктори (реалізують дії по ініціалізації екземплярів або класу в цілому).
  4. Властивості (визначають характеристики класу відповідно до способами їх завдання і отримання).
  5. Деструктори (визначають дії, які необхідно виконати до того, як об'єкт буде знищений).
  6. Індексатори (забезпечують можливість доступу до елементів класу по їх порядковому номеру).
  7. Операції (задають дії з об'єктами за допомогою знаків операцій).
  8. Події (визначають повідомлення, які може генерувати клас).
  9. Типи (типи даних, внутрішні по відношенню до класу).
В даному розділі ми розглянемо перші чотири категорії елементів класу
Перш ніж приступити до проектування класів, необхідно поговорити про присвоєнні і порівнянні об'єктів. Механізм виконання присвоювання один і той же для величин будь-якого типу, як посилального, так і розмірного, проте результати різняться. При присвоєнні значення копіюється значення, а при присвоєнні посилання - посилання, тому після присвоювання одного об'єкта іншому ми отримаємо два посилання, що вказують на одну і ту ж область пам'яті:
13_01
Нехай були створені три об'єкти а , b і з , а потім виконано присвоювання b = з . Тепер посилання b і з вказують на один і той же об'єкт. Старе значення b стає недоступним і очищається складальником сміття.
Аналогічна ситуація з операцією перевірки на рівність. величинизначимого типу рівні, якщо рівні їх значення. Величини посилального типу рівні, якщо вони посилаються на одні й ті ж дані. Так, об'єкти b і з рівні, тому що вони посилаються на одну і ту ж область пам'яті. Але а не дорівнює b навіть за однакової кількості їх значень.
Дані: поля і константи
Дані, що містяться в класі, можуть бути змінними або константами і задаються відповідно до правил, розглянутими в темі "Ідентифікатори". При описі даних також можна вказувати атрибути і специфікатор, що задають різні характеристики елементів. Синтаксис опису елемента даних наведено нижче:
[Атрибути] [специфікатор] [const] тип ім'я [= початкове_значення]
Розглянемо можливі специфікатор для даних:
специфікаторопис
1newНове опис поля, яке приховує успадкований елемент класу
2publicДоступ до елементу не обмежений
3protectedДоступ тільки з даного та похідних класів
4internalДоступ лише з даної збірки
5protected internalДоступ тільки з даного та похідних класів і з даної збірки
6privateДоступ тільки з даного класу
7staticОдне поле для всіх екземплярів класу
8readonlyПоле доступне тільки для читання (значення таких полів можна встановити або при описі, або в конструкторі)
9volatileПоле може змінюватися іншим процесом або системою
Зауваження . Атрибути будуть розглянуті пізніше.
Для констант можна використовувати тільки специфікатор 1-6.
За замовчуванням елементи класу вважаються закритими private . Для полів класу цей вид доступу є кращим, оскільки поля визначають внутрішню будову класу, яке повинно бути приховано від користувача. Всі методи класу мають безпосередній доступ до його закритим полях.
Поля, описані з специфікатором static , а також константи існують в єдиному екземплярі для всіх об'єктів класу, тому до них звертаються не через ім'я екземпляра, а через ім'я класу. Звернення до поля класу виконується за допомогою операції доступу (точка). Праворуч від точки задається ім'я поля, зліва - ім'я екземпляра для звичайних полів або ім'я класу для статичних. Розглянемо приклад створення класу Demo і два способи звернення до його полях.
class Circle
{
 public int x = 0;
 public int y = 0;
 public int radius = 3;
 public const double pi = 3.14;
 public static string name = "Коло";
 double p;
 double s;
}

class Program
{
 static void Main ()
 {
  Circle cr = new Circle (); // створення екземпляра класу
  Console.WriteLine ( "pi =" + Circle.pi); // звернення до константи
  Console.Write (Circle.name); // звернення до статичного полю
  // звернення до звичайних полях
  Console.WriteLine ( "з центром в точці ({0}, {1}) і радіусом {2}", cr.x, cr.y, cr.radius);
  // Console.WriteLine (cr.p); - викличе помилку, тому що поле p має тип private
               
  Console.Write ( "Введіть коефіцієнт =");
  int kof = int.Parse (Console.ReadLine ());
  cr.x - = kof; cr.y + = kof; cr.radius * = kof;
  Console.WriteLine ( "Нова окружність з центром в точці ({0}, {1}) і радіусом {2}",
  cr.x, cr.y, cr.radius);
  //cr.s = 2 * Circle.pi * cr.radius; - викличе помилку, тому що поле s має тип private
 }
}
методи
Зауваження . Створення і використання методів було розглянуто нами раніше. Тепер розглянемо використання методів в контексті створення класів.
Методи знаходяться в пам'яті в єдиному екземплярі і використовуються всіма об'єктами одного класу спільно, тому необхідно забезпечити роботу методів нестатичних примірників з полями саме того об'єкту, для якого вони були викликані. Для цього в будь-який нестатичних метод автоматично передається прихований параметр this, в якому зберігається посилання на який викликав функцію екземпляр.
В явному вигляді параметр this застосовується для того, щоб повернути з методу посилання на який викликав об'єкт, а також для ідентифікації поля в разі, якщо його ім'я збігається з ім'ям параметра методу, наприклад:

class Circle
{
 public int x = 0;
 public int y = 0;
 public int radius = 3;
 public const double pi = 3.14;
 public static string name = "Коло";
  public Circle T () // метод повертає посилання на екземпляр класу
 {
  return this;
 }
 public void Set (int x, int y, int r) 
 {
  this.x = x;
  this.y = y;
 radius = r;
 }
}

class Program
{
 static void Main ()
 {
  Circle cr = new Circle (); // створення екземпляра класу
  Console.WriteLine ( "pi =" + Circle.pi); // звернення до константи
  Console.Write (Circle.name); // звернення до статичного полю
  // звернення до звичайних полях
  Console.WriteLine ( "з центром в точці ({0}, {1}) і радіусом {2}", cr.x, cr.y, cr.radius);      
  cr.Set (1, 1, 10);
  Console.WriteLine ( "Нова окружність з центром в точці ({0}, {1}) і радіусом {2}", 
     cr.x, cr.y, cr.radius);
  Circle b = cr.T (); // отримуємо посилання на об'єкт cr, аналог b = c
  Console.WriteLine ( "Новий канал на коло з центром в точці ({0}, {1}) 
       і радіусом {2} ", bx, by, b.radius);
  }
}

Комментариев нет:

Отправить комментарий