- •Міністерство освіти і науки, молоді та спорту україни
- •Розділ 1. Основи платформи .Net
- •1.1. Основи платформи .Net
- •1.2. Загальні відомості об'єктно-орієнтованого програмування
- •1.3. Середовище Visual Studio .Net
- •1.4 Консольні додатки
- •Розділ 2. Основні поняття мови
- •2.1. Склад мови
- •2.1.1 Алфавіт і лексеми
- •2.1.2. Ідентифікатори і ключові слова
- •2.1.3. Знаки операцій і роздільники
- •2.1.4. Літерали
- •Константи в с#
- •Суфікси цілих і дійсних констант
- •Управляючі послідовності у с#
- •2.1.5. Коментарі
- •2.2. Типи даних
- •2.2.1. Класифікація типів
- •2.2.2. Типи літералів
- •2.2.3. Типи-значення і посилальні типи
- •2.2.4. Упаковка і розпаковування
- •2.3. Рекомендації по програмуванню
- •Розділ 3. Змінні, іменовані константи, операції і вирази
- •3.1. Змінні і іменовані константи
- •3.2. Операції і вирази
- •3.2.1. Перетворення вбудованих арифметичних типів-значень
- •3.2.2. Введення у виключення
- •3.2.3. Основні операції с#
- •Операнд_1 ? операнд_2 : операнд_3.
- •3.3. Лінійні програми (програмування лінійних обчислювальних процесів)
- •3.3.1. Просте введення-виведення даних
- •3.3.2. Математичні функції - клас Math
- •Розділ 4. Оператори
- •4.1. Вирази, блоки
- •4.2. Оператори розгалуження
- •4.2.1. Умовний оператор if
- •4.2.1. Умовний оператор switch
- •4.3. Оператори циклу
- •4.3.1. Цикл з передумовою while
- •4.3.2. Цикл з постумовою do
- •4.3.3. Цикл з параметром for
- •For ( ініціалізація; вираз; модифікації ) оператор;
- •4.3.4. Цикл перебору foreach
- •4.3.5. Рекомендації по вибору оператора циклу
- •4.4. Обробка виняткових ситуацій
- •4.4.1. Оператор try
- •Try блок [ блоки catch ] [ блок finally ]
- •4.4.2. Оператор throw
- •Throw [ вираз ];
- •4.4.3. Клас Exception
- •4.4.4. Оператори checked и unchecked
- •4.5. Рекомендації по програмуванню
- •Розділ 5. Класи: основні поняття
- •5.1. Привласнення і порівняння об'єктів
- •5.2. Дані: поля і константи
- •5.3. Методи
- •5.3.1. Параметри методів
- •5.3.2. Параметри-значення
- •5.3.3. Параметри-посилання
- •5.3.4. Вихідні параметри
- •5.4. Ключове слово this
- •5.5. Конструктори
- •5.6. Властивості
- •[ Атрибути ] [ специфікатори ] тип ім’я_властивості
- •[ Get код_доступа ] [ set код_доступа ]
- •5.7. Рекомендації по програмуванню
- •Розділ 6. Масиви і рядки
- •6.1. Одновимірні масиви
- •6.2. Прямокутні масиви
- •6.3. Ступінчасті масиви
- •6.4. Клас System.Array
- •6.5. Клас Random
- •6.6. Оператор foreach
- •6.7. Масиви об’єктів
- •6.8. Символи і рядки
- •6.8.1. Символи
- •6.8.2. Масиви символів
- •6.8.3. Рядки типу string
- •6.8.4. Форматування рядків
- •6.8.5. Рядки типу StringBuilder
- •6.9. Рекомендації з програмування
- •Розділ 7. Класи: подробиці
- •7.1. Перевантаження методів
- •7.2. Рекурсивні методи
- •7.3. Методи із змінною кількістю аргументів
- •7.4. Метод Main
- •7.5. Індексатори
- •7.6. Операції класу
- •7.6.1. Унарні операції
- •7.6.2. Бінарні операції
- •7.6.3. Операції перетворення типу
- •7.7. Деструктор
- •7.8. Вкладені типи
- •7.9. Рекомендації по програмуванню
- •Розділ 8. Ієрархії класів
- •8.1. Спадкоємство
- •8.2. Віртуальні методи
- •8.3. Абстрактні класи
- •8.4. Безплідні класи
- •8.5. Клас object
- •8.6. Рекомендації по програмуванню
- •Розділ 9. Інтерфейси і структурні типи
- •9.1. Синтаксис інтерфейсу
- •9.2. Реалізація інтерфейсу
- •9.3. Робота з об'єктами через інтерфейси. Операції is і as
- •9.4. Інтерфейси і спадкоємство
- •9.5. Стандартні інтерфейси .Net
- •9.5.1. Порівняння об'єктів (інтерфейс iComparable)
- •9.5.2 Сортування по різних критеріях (інтерфейс iComparer)
- •9.5.3 Перевантаження операцій відношення
- •9.5.4. Клонування об'єктів (інтерфейс iСloneable)
- •9.5.5. Перебір об'єктів (інтерфейс iEnumerable) і ітератори
- •9.6. Структури
- •9.7. Перелічення
- •9.7.1 Операції з переліченнями
- •9.7.2. Базовий клас System.Enum
- •9.8. Рекомендації по програмуванню
- •Розділ 10. Делегати, події і потоки виконання
- •10.1. Делегати
- •10.1.1. Опис делегатів
- •10.1.2. Використання делегатів
- •10.1.3. Патерн “спостерігач”
- •10.1.4. Операції
- •10.1.5. Передача делегатів в методи
- •10.1.6. Обробка виключень при виклику делегатів
- •10.3. Багатопотокові додатки
- •10.3.1. Клас Thread
- •Lock ( вираз ) блок_операторів
- •10.3.2. Асинхронні делегати
- •10.4. Рекомендації по програмуванню
- •Розділ 11. Робота з файлами
- •11.1. Потоки байтів
- •11.2. Асинхронне уведення-виведення
- •11.3. Потоки символів
- •11.4. Двійкові потоки
- •11.5. Консольне уведення-виведення
- •11.6. Робота з каталогами і файлами
- •11.7. Збереження об'єктів (серіалізація)
- •11.8. Рекомендації по програмуванню
- •Розділ 12. Збірки, бібліотеки, атрибути, директиви
- •12.2. Створення бібліотеки
- •12.3. Рефлексія
- •12.4. Атрибути
- •12.5. Простір імен
- •12.6. Директиви препроцесора
- •# Константний_вираз
- •[ #Elif константний_вираз
- •[ #Elif константний_вираз
- •Розділ 13. Структури даних, колекції і класи-прототипи
- •13.1. Абстрактні структури даних
- •13.2. Простір імен System.Collections
- •13.3. Клас ArrayList
- •13.4. Класи-прототипи
- •13.5. Створення класу-прототипу
- •13.6. Узагальнені методи
- •13.7. Часткові типи
- •13.8. Типи, що обнуляються
- •13.9. Рекомендації по програмуванню
- •Розділ 14. Додаткові засоби с#
- •14.1. Небезпечний код
- •Unsafe блок
- •14.1.1. Синтаксис вказівок
- •14.1.2. Перетворення та ініціалізація вказівок
- •14.1.3. Операції з вказівками
- •14.2. Регулярні вирази
- •14.2.1. Метасимволи
- •14.2.2. Класи бібліотеки .Net для роботи з регулярними виразами
- •14.3. Документування у форматі xml
- •Лабораторні роботи
- •Лабораторна робота 5. Одновимірні масиви
- •Лабораторна робота 6. Двовимірні масиви
- •Лабораторна робота 7. Рядки
- •Лабораторна робота 8. Класи і операції
- •Лабораторна робота 9. Спадкоємство
- •Лабораторна робота 10. Структури
- •Лабораторна робота 11. Інтерфейси і параметризовані колекції
- •Список літератури
- •Додатки Додаток 1. Специфікатори формату для рядків с#
8.2. Віртуальні методи
Для позначення віртуальних функцій використовується ключове слово virtual. Воно записується в заголовку методу базового класу, наприклад:
virtual public void Passport( )
Слово virtual в перекладі з англійського означає "фактичний". Оголошення методу віртуальним означає, що всі посилання на цей метод вирішуватимуться за фактом його виклику, тобто не на стадії компіляції, а під час виконання програми. Цей механізм називається пізнім зв’язуванням.
Для його реалізації необхідно, щоб адреси віртуальних методів зберігалися там, де ними можна буде у будь-який момент скористатися. Компілятор формує для цих методів таблицю віртуальних методів (Virtual Method Table, VMT) . У цю таблицю записуються адреси віртуальних методів (зокрема успадкованих) в порядку опису в класі. Для кожного класу створюється одна таблиця.
Кожен об'єкт під час виконання повинен мати доступ до VMT. Забезпечення цього зв'язку не можна доручити компілятору, оскільки він повинен встановлюватися під час виконання програми при створенні об'єкту. Тому зв'язок екземпляра об'єкту з VMT встановлюється за допомогою спеціального коду, що автоматично поміщається компілятором в конструктор об'єкту.
Якщо в похідному класі потрібно перевизначити віртуальний метод, використовується ключове слово override, наприклад:
override public void Passport( )
Перевизначений віртуальний метод повинен володіти таким же набором параметрів, як і однойменний метод базового класу. Це вимога цілком природна, якщо врахувати, що однойменні методи, що відносяться до різних класів, можуть викликатися з однієї і тієї ж точки програми.
Додамо в лістинг 8.2 два чарівні слова - virtual і override - в описи методів Passport, відповідно, базового і похідного класів (лістинг 8.3).
Лістинг 8.3. Віртуальні методи
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace examp49
{
class Monster
{
...
virtual public void Passport()
{
Console.WriteLine(
"Monster {0} \t health = {1} ammo = {2}",
name, health, ammo);
}
protected string name; // закриті поля
public int health, ammo;
}
class Daemon : Monster
{
override public void Passport()
{
Console.WriteLine(
"Daemon {0} \t health = {1} ammo = {2} brain = {3}", name, health, ammo, brain);
}
class Classl
{
static void Main()
{
const int n = 3;
Monster[] stado = new Monster[n];
stado[0] = new Monster("Monia");
stado[1] = new Monster("Monk");
stado[2] = new Daemon("Dimon", 3);
foreach (Monster elem in stado) elem.Passport();
for (int i = 0; i < n; ++i) stado[i].ammo = 0;
Console.WriteLine();
foreach (Monster elem in stado) elem.Passport();
}
}
}
Результат роботи програми:
Monster Monia health = 100 ammo = 100
Monster Monk health = 100 ammo = 100
Daemon Dimon health = 100 ammo = 100 brain = 3
Monster Monia health = 100 ammo = 0
Monster Monk health = 100 ammo = 0
Daemon Dimon health = 100 ammo = 0 brain = 3
Віртуальні методи базового класу визначають інтерфейс всієї ієрархії. Цей інтерфейс може розширюватися в нащадках за рахунок додавання нових віртуальних методів.
Виклик віртуального методу виконується так: з об'єкту береться адреса його таблиці VMT, з VMT вибирається адреса методу, а потім управління передається цьому методу. Таким чином, при використанні віртуальних методів зі всіх однойменних методів ієрархії завжди вибирається той, який відповідає фактичному типу об'єкту, що викликав його.
Виклик віртуального методу, на відміну від звичайного, виконується через додатковий етап отримання адреси методу з таблиці VMT, що декілька уповільнює виконання програми.
За допомогою віртуальних методів реалізується один з основних принципів об'єктно-орієнтованого програмування - поліморфізм. Це слово в перекладі з грецького означає "багато форм", що в даному випадку означає "один виклик - багато методів". Застосування віртуальних методів забезпечує гнучкість і можливість розширення функціональності класу.
Віртуальні методи незамінні і при передачі об'єктів в методи як параметри. У параметрах методу описується об'єкт базового типу, а при виклику в ньому передається об'єкт похідного класу. В цьому випадку віртуальні методи, що викликаються для об'єкту з методу, відповідатимуть типу аргументу, а не параметра.
При описі класів рекомендується визначати як віртуальних ті методи, які в похідних класах повинні реалізовуватися по-іншому. Якщо у всіх класах ієрархії метод виконуватиметься однаково, його краще визначити як звичайний метод.