- •Тема 1 Програмна технологія Microsoft .Net. Вступ
- •Загальна характеристика платформи .Net Framework
- •Єдине середовище виконання clr
- •Єдина система типів cts
- •Бібліотека базових типів bcl
- •Розбір найпростішої програми на мові с
- •Загальна структура програми на мові c#
- •Створення .Net-додатків з використанням csc.Exe
- •Створення .Net-додатків на мові c# з використанням ide Visual с# 2010 Express
- •Тема 2 Класи в c# Вступ
- •Синтаксис опису класу
- •Поля класу
- •Методи класу
- •Властивості та індексатори
- •Конструктори
- •Деструктор
- •Перевантаження операцій
- •Частинні випадки класу
- •Структура «Раціональне число»
- •Тема 3 Основні засоби розробки класів у c# Вступ
- •Успадкування
- •Поліморфне успадкування
- •Агрегація та композиція
- •Абстрактні класи
- •Інтерфейси
- •Тема 4 Узагальнення Поняття узагальнених класів
- •Обмеження (constraints) для параметрів типу
- •Узагальнені методи
- •Узагальнені інтерфейси
- •Недолік обмеження операцій
Тема 3 Основні засоби розробки класів у c# Вступ
Однією із переваг ООП є те, що більшість класів для реалізації об’єктів не доводиться розробляти «з нуля». Зазвичай класи будують на основі вже існуючих, реалізовуючи тим самим третій важливий принцип ООП − ієрархічність.
Ієрархія − проранжована або впорядкована система абстракцій. Принцип ієрархічності передбачає використання ієрархій при розробці великих програмних систем.
В ООП при розробці класів використовуються два види ієрархії, які визначаються двома основними видами відношень між абстракціями: «загальний/окремий» та «ціле/частина».
Успадкування
Відношення «загальний/окремий» − вказує на те, що деяка абстракція є частинним випадком іншої більш загальної абстракції, наприклад, «точка − найпростіший випадок геометричної фігури» також «опуклий многокутник − окремий випадок геометричної фігури».
В свою чергу наявність між абстракціями зв’язку «загальний/окремий» визначає відношення успадкування між класами, яке передбачає можливість при описі класу абстракції зберігати та використовувати структурну або функціональну частину іншої або декількох інших абстракцій (відповідно просте та множинне успадкування).
Успадкуванням або узагальненням називається відношення між класами, при якому один клас будується на базі іншого шляхом додавання нових полів та визначення нових методів. При цьому вихідний клас, на базі якого виконується побудова, називається базовим (батьківським, предком, або суперкласом), а той, що будується − похідним (дочірнім, нащадком або підкласом).
Відношення між різними класами проекту прийнято ілюструвати діаграмою відношень класів, або просто діаграмою класів. На діаграмі клас зображується у вигляді прямокутника, який додатково може бути розділений горизонтальними лініями на одну, дві чи три секції. У окремих секціях може вказуватися ім’я класу, поля та методи класу. Відкритим членам класу передує знак «+», а закритим − «-». Обов’язковим елементом позначення класу є його ім’я. На початкових етапах розробки діаграми окремі класи можуть позначатися простим прямокутником із зазначенням тільки імені відповідного класу.
Якщо на діаграмі класів зображено тільки відношення успадкування, то таку діаграму називають ієрархією класів. На діаграмі класів успадкування зображують лінією із трикутною не зафарбованою стрілкою на кінці, яка направлена до базового класу (мал. 1). На діаграмах класів при необхідності допускається довільне розташування базових класів та похідних.
Мал. 1. Приклад ієрархії класів із двома похідними класами
У лістингу 1 наведено програмну реалізацію класу Shape у відповідності до наведеної діаграми класів.
Лістинг 1. Реалізація класу Shape
public class Shape { //назва геометричної фігури private string name; //конструктор з параметром public Shape(string ShapeName) { name = ShapeName; } //приклад реалізації методу зображеня фігури public void Draw() { Console.WriteLine("{"); Console.WriteLine(" Фiгура - {0}", name); Console.WriteLine("}"); } } |
Розглянемо особливості, пов’язані із механізмом успадкування у мові C# на прикладі похідного класу Point. Зразу відмітимо, що у мові C# базовий клас при успадкуванні може бути тільки один. При визначенні похідного класу він вказується після імені похідного класу через «:»:
[атрибути] [модифікатори] class ім'я_класу : ім’я_базового_класу { ... } |
Наприклад для класу Point визначення виглядає так:
public class Point : Shape { } |
За допомогою принципу успадкування у мові C# усі класи утворюють єдину ієрархію класів (типів об’єктів), вершиною якої є клас object, тобто клас object є базовим за замовчуванням для всіх інших класів.
Базова та власна частина похідного класу. Похідний клас отримує у спадок (містить) усі члени (окрім конструкторів) базового класу − це його, так звана, базова частина. Але, як зазначалось вище, він може бути доповнений (містити) і нові члени − це його власна частина. Наприклад:
public class Point : Shape { //абсциса точки public double x; //ордината точки public double y; } |
Доступ до базової частини похідного класу. Доступ із похідного класу можливий тільки до тих членів базової частини, які визначені з модифікаторами public чи protected (доступ до члена класу можна отримати тільки з коду в тому ж класі або структурі, або в похідному класі). Закриті (private) члени базового класу у похідному є недоступними. Тому для забезпечення доступу до закритих членів базового класу із похідного, їх оголошенню повинен передувати модифікатор protected. Наприклад
public class Shape { protected string name; ... } |
Захищеним членам класу на діаграмі класів передує знак «#».
Успадкування та конструктори. Створення об’єкта похідного класу здійснюється за допомогою конструктора, при цьому конструктор базового класу конструює базову частину класу об’єкта, а конструктор похідного класу − власну.
Якщо у похідному класі не визначати жодного конструктора, то для конструювання власної частини класу об’єкта його буде надано компілятором автоматично (конструктор за замовчуванням). Навпаки. Якщо конструктор визначено тільки у похідному класі, то базова частина класу об’єкта буде автоматично конструюватися за допомогою конструктора за замовчуванням базового класу. Однак, у обох випадках слід пам’ятати, що якщо у базовому класі є тільки конструктори з параметрами, то виникне помилка. Для її виправлення потрібно визначити в базовому класі конструктор без параметрів.
При визначенні конструктора похідного класу для конструювання його базової частини є можливість явного виклику конструктора базового класу. Виклик конструктора базового класу здійснюється не в тілі конструктора похідного класу чи де інде, а для цього використовується спеціальний синтаксис, який називається ініціалізацією у заголовку:
public ім'я_класу (список_параметрів) : base(список_аргументів) { //ініціалізація власної частини похідного класу на основі відповідного списку аргументів } |
Відмітимо, що так чи інакше, але конструктор похідного класу повинен забезпечити коректну ініціалізацію як базової частини, так і власної. Тому при використанні конструктора з ініціалізацією у заголовку список параметрів конструктора похідного класу у загальному випадку повинен містити дані для ініціалізації даних обох частин похідного класу. Параметри, які ініціалізують структурні властивості базового класу, передаються як список аргументів його конструкторові, а конструктор похідного класу далі ініціалізує вже тільки власну частину. Наприклад:
public class Point : Shape { public Point(double x0, double y0) : base("Точка") { x = x0; y = y0; } } |
Якщо виклик конструктора базового класу не вказується, то компілятор автоматично здійснює спробу виклику конструктора за замовчуванням або конструктора без параметрів базового класу.
Заборона успадкування. У мові С# існує можливість заборони успадкування класу. Це здійснюється за допомогою використання модифікатора sealed у списку модифікаторів класу.
public sealed class Point : Shape { ... } |
