Класи: основні поняття, дані, методи, конструктори, властивості
класи
Основні поняття
Клас - це узагальнене поняття, що визначають характеристики і поведінку деякого безлічі об'єктів, званих екземплярами класу. "Класичний" клас містить дані, що визначаютьвластивості об'єктів класу , і методи, що визначають їх поведінку. Для Windows-додатків в клас додається третя складова - події, на які можереагувати об'єкт класу. Всі класи бібліотеки .Net, а також всі класи, які створює програміст в середовищі .Net, мають одного загального предка - клас object .
Всі програми, розглянуті раніше, складалися з одного класу з одним методом Main і декількома допоміжними статичними методами. Тепер розглянемо поняття "клас" більш детально.
Опис класу містить ключове слово class, за яким слід його ім'я , а далі в фігурних дужках - тіло класу. Крім того, для класу можна задати його базові класи (предки) і ряд необов'язкових атрибутів і специфікаторів, що визначають різні характеристики класу:
[Атрибути] [специфікатор] class ім'я_класу [: предки] {Тело_класса}
Найпростіший приклад класу:
class Demo {}
Специфікатори визначають властивості класу, а також доступність класу для інших елементів програми. Можливі значення специфікаторів перераховані в наступній таблиці:
№ | специфікатор | опис |
---|---|---|
1 | new | Задає новий опис класу замість успадкованого від предка. Використовується для вкладення класів (в ієрархії об'єктів). |
2 | public | Доступ до класу не обмежений |
3 | protected | Доступ тільки з даного або похідного класу. Використовується для вкладених класів. |
4 | internal | Доступ лише з даної програми (збірки). |
5 | protected internal | Доступ тільки з даного та похідного класу і з даної програми (збірки). |
6 | private | Доступ лише з елементів класу, всередині яких описаний даний клас. Використовується для вкладених класів. |
7 | static | Статичний клас. Дозволяє звертатися до методів класу без створення екземпляра класу |
8 | sealed | Безплідний клас. Забороняє успадкування даного класу. Застосовується в ієрархії об'єктів. |
9 | abstract | Абстрактний клас. Застосовується в ієрархії об'єктів. |
Специфікатори 2-6 називаються специфікаторами доступу . Вони визначають, звідки можна безпосередньо звертатися до даного класу. Специфікатори доступу можуть комбінуватися з іншими специфікаторами.
Зауваження . Атрибути будуть розглянуті пізніше.
Клас можна описувати безпосередньо всередині простору імен або всередині іншого класу. В останньому випадку клас називається вкладеним. Залежно від місця опису класу деякі з цих специфікаторів можуть бути заборонені. В даному розділі ми розглянемо класи, які описуються безпосередньо в просторі імен. Для таких класів допускаються тільки два специфікатор: public і internal . За замовчуванням, тобто якщо жоден специфікатор доступу не вказано, мається на увазі специфікатор internal .
Об'єкти створюються явним або неявним чином, тобто або програмістом, або системою. Програміст створює екземпляр класу за допомогою операції new, наприклад:
Demo a = new Demo (); // Створюється екземпляр класу Demo
Якщо достатній для зберігання об'єкта обсяг пам'яті виділити не вдалося, то генерується виключення OutOfMemoryException .
Для кожного об'єкта при його створенні в пам'яті виділяється окрема область, в якій зберігаються його дані. У класі можуть бути присутнімистатичні елементи , які існують в єдиному екземплярі для всіх об'єктів класу. Статичні дані часто називають даними класу, а решта - даними примірника. Для роботи з даними класу використовуються статичні методи класу, для роботи з даними примірника -методи примірника , або просто методи.
До сих пір ми використовували в програмах тільки дані (змінні і константи) і методи. У загальному випадку клас може містити наступні функціональні елементи:
- Дані: змінні або константи.
- Методи, що реалізують не тільки обчислення, а й інші дії, що виконуються класом або його примірником.
- Конструктори (реалізують дії по ініціалізації екземплярів або класу в цілому).
- Властивості (визначають характеристики класу відповідно до способами їх завдання і отримання).
- Деструктори (визначають дії, які необхідно виконати до того, як об'єкт буде знищений).
- Індексатори (забезпечують можливість доступу до елементів класу по їх порядковому номеру).
- Операції (задають дії з об'єктами за допомогою знаків операцій).
- Події (визначають повідомлення, які може генерувати клас).
- Типи (типи даних, внутрішні по відношенню до класу).
В даному розділі ми розглянемо перші чотири категорії елементів класу
Перш ніж приступити до проектування класів, необхідно поговорити про присвоєнні і порівнянні об'єктів. Механізм виконання присвоювання один і той же для величин будь-якого типу, як посилального, так і розмірного, проте результати різняться. При присвоєнні значення копіюється значення, а при присвоєнні посилання - посилання, тому після присвоювання одного об'єкта іншому ми отримаємо два посилання, що вказують на одну і ту ж область пам'яті:
Нехай були створені три об'єкти а , b і з , а потім виконано присвоювання b = з . Тепер посилання b і з вказують на один і той же об'єкт. Старе значення b стає недоступним і очищається складальником сміття.
Аналогічна ситуація з операцією перевірки на рівність. величинизначимого типу рівні, якщо рівні їх значення. Величини посилального типу рівні, якщо вони посилаються на одні й ті ж дані. Так, об'єкти b і з рівні, тому що вони посилаються на одну і ту ж область пам'яті. Але а не дорівнює b навіть за однакової кількості їх значень.
Дані: поля і константи
Дані, що містяться в класі, можуть бути змінними або константами і задаються відповідно до правил, розглянутими в темі "Ідентифікатори". При описі даних також можна вказувати атрибути і специфікатор, що задають різні характеристики елементів. Синтаксис опису елемента даних наведено нижче:
[Атрибути] [специфікатор] [const] тип ім'я [= початкове_значення]
Розглянемо можливі специфікатор для даних:
Зауваження . Атрибути будуть розглянуті пізніше.
Для констант можна використовувати тільки специфікатор 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); } }
Комментариев нет:
Отправить комментарий