- •Мови програмування. Представлення даних.
- •1. Вступ. Про обчислювальну техніку.
- •2. Історія мов програмування.
- •3. Поняття про платформу .Net
- •4. Створення мови програмування с#.
- •5. Представлення даних. Необхідність типізації. Двійкова арифметика.
- •6. Основні поняття програмування.
- •Поняття про інтегроване середовище розробки VisualStudio (на прикладі Visual Studio 2005). Структура c#-програми.
- •1. Основні можливості інтегрованого середовища розробки VisualStudio .Net.
- •2. Структура програми мовою с#.
- •Int I; // Визначили цілу змінну
- •Основні елементи мови с#.
- •1. Основні вбудовані типи мови с#
- •2. Визначення та ініціалізація змінних, область їх видимості.
- •3. Приведення типів.
- •Інакше обидва операнди перетворюються до типу int;
- •4. Літерали (константи) мови с#.
- •5. Операції мови с#.
- •5.1. Арифметичні операції.
- •5.2. Операції інкременту та декременту.
- •5.3. Операції відношення (порівняння).
- •5.4. Логічні операції.
- •5.5. Порозрядні (бітові) операції.
- •5.6. Умовна (тернарна) операція.
- •5.7. Операції присвоєння.
- •5.8. Пріоритет операцій.
- •Основні інструкції керування мови с# – розгалуження та цикли.
- •1. Розгалуження у мові с#
- •2. Цикли у мові с#
- •2.1. Цикл for.
- •2.2. Цикл while.
- •2.3. Цикл do-while.
- •3. Керування виходом із циклів с#
- •Масиви в мові с#.
- •1. Визначення та ініціалізація масиву.
- •2. Цикл foreach
- •3. Багатовимірні масиви.
- •4. Використання деяких методів класу System.Array.
- •5. Масиви масивів. Непрямокутні масиви.
- •Структуровані типи даних (колекції) в мові c#
- •1. Основні структури даних та їх призначення
- •2. Використання списку ArrayList та узагальненого списку List
- •3. Використання асоційованого списку Hashtable та узагальненого словника Dictionary
- •Класи в мові с#.
- •1. Визначення класу.
- •2. Методи класу.
- •3. Методи з параметрами.
- •4. Конструктор класу.
- •Методи в мові с#.
- •1. Передача об’єктів методам.
- •2. Використання модифікаторів для параметрів методів.
- •3. Методи, що повертають об’єкти.
- •Перевантаження методів в мові с#.
- •1. Перевантаження методів.
- •2. Перевантаження конструкторів.
- •3. Використання ключового слова this.
- •4. Деструктор класу.
- •5. Метод Main ().
- •Статичні члени класу.
- •1. Статичні дані-члени класу.
- •2. Статичні методи-члени класу.
- •3. Статичний конструктор класу.
- •4. Статичні класи, локалізація та глобалізація
- •Властивості та індексатори.
- •1. Властивості.
- •2. Індексатори.
- •Спадкування в мові с#.
- •1. Поняття про спадкування та ієрархію класів.
- •2. Спадкування та правила доступу до членів класів.
- •3. Конструктори базового та похідних класів.
- •4. Посилання на екземпляри базового та похідних класів.
- •5. Поняття про поліморфізм.
- •6. Віртуальні функції – більш детальний погляд.
- •7. Абстрактні методи та класи.
- •Перевантаження операцій в мові с#.
- •1. Загальні відомості.
- •2. Перевантаження бінарних арифметичних операцій.
- •3. Перевантаження унарних операцій.
- •4. Перевантаження операцій відношення.
- •5. Перевантаження логічних операцій.
- •6. Підсумкові зауваження.
- •Структури та переліки в мові с#.
- •1. Структури.
- •2. Переліки.
- •Делегати, події та обробники подій
- •1. Делегати (delegate).
- •2. Події та їх обробники.
- •Атрибути та їх використання
- •Рекомендована література
Перевантаження методів в мові с#.
1. Перевантаження методів.
Мова С# дозволяє реалізувати цікаву можливість при створенні методів – різні за змістом методи можуть мати однакові ідентифікатори. Ця технологія називається перевантаженням (overloading) методів. В програмуванні вживається термін «сигнатура методу» – сигнатура включає ідентифікатор методу та список його параметрів. Перевантаження дозволене для методів з різними сигнатурами. Тобто два або більше методів можуть мати однакові ідентифікатори при умові, що їх списки параметрів різняться або кількістю, або типами, або і тим, і іншим. Зверніть увагу, що результат, який повертається методом, до сигнатури не включається, отже, при перевантаженні методам недостатньо мати відмінності лише в типі результату. Якщо виникає питання про корисність такої можливості, то зауважимо, що однією із поширених студентських помилок при використання стандартної функції мови С++ для обчислення модуля числа є виклик функції abs(x), що повертає ціле значення модуля цілого числа x, в той час, коли необхідне звертання до функції fabs(x) з дійсними аргументом та результатом. А якщо згадати, що є ще функція labs(x) з довгим цілим результатом… Зрозуміло, що значно корисніше було б мати методи однакового призначення з однаковими ідентифікаторами для різних типів параметрів.
Розглянемо приклад, в якому перевантажені 4 методи MyMethod – з параметрами типів int, float, double та з двома цілими параметрами.
using System;
namespace Overloading
{
class Program
{// В цьому класі перезавантажуються методи
public void MyMethod (int x)
{
Console.WriteLine("Метод з цiлим параметром x = {0}", x);
}
public void MyMethod(float x)
{
Console.WriteLine("Метод з дiйсним параметром x ={0}",x);
}
public void MyMethod(double x)
{
Console.WriteLine(
"Метод з параметром подвоєної точностi x = {0}", x);
}
public void MyMethod(int x, int y)
{
Console.WriteLine("Метод з двома цiлими параметрами
x = {0} y = {1}", x, y);
}
static void Main()
{
Program pr = new Program();
pr.MyMethod(1);
pr.MyMethod(1.5);
pr.MyMethod(2.5F);
pr.MyMethod(1, 2);
}
}
}
Виконання цієї програми показує, що кожен раз викликається метод із сигнатурою відповідною типу формальних аргументів. На екрані побачимо:
Метод з цiлим параметром x = 1
Метод з параметром подвоєної точностi x = 1,5
Метод з дiйсним параметром x = 2,5
Метод з двома цiлими параметрами x = 1 y = 2
Виникає слушне питання, а що коли методу передається параметр, наприклад, цілий, але не int? Спробуємо виконати виклик функції MyMethod наступним чином:ї
byte b = 8;
pr.MyMethod(b);
Одержимо наступний результат:
Метод з цiлим параметром x = 8
Тобто викликається метод MyMethod (int x). Компілятор намагається підібрати серед методів, які перевантажуються, той, що найкращим чином відповідає фактичному аргументу (в даному разі типу byte) згідно правил приведення типів. Тому наступні звертання до методу MyMethod
pr.MyMethod(100L);
pr.MyMethod('A');
призведуть до цілком очікуваних наступних повідомлень:
Метод з дiйсним параметром x = 100
Метод з цiлим параметром x = 65
Тобто при першому виклику відбувається приведення фактичного аргументу до найближчого типу float, а у другому випадку тип char приводиться до типу int, і ми бачимо на екрані код символу 'A'.
Проте спроба виклику pr.MyMethod(1.1, 2.2); призведе до синтаксичної помилки, оскільки найбільш відповідним методом для цього виклику компілятор вважатиме MyMethod(int x, int y), але не матиме можливості виконати неявне приведення фактичних аргументів типу double до типу int.
Додамо тепер ще один метод MyMethod у клас Program:
public void MyMethod(ref int x)
{
x++;
Console.WriteLine("Метод з цiлим параметром
ref x = {0}", x);
}
Він теж має один параметр типу int , проте цей параметр використовується із модифікатором ref. Перевіримо, чи відрізнятиме компілятор сигнатури двох перевантажених методів MyMethod (int x) та MyMethod(ref int x). Внаслідок звертання
int i = 1;
pr.MyMethod(ref i);
одержимо результат Метод з цiлим параметром ref x = 2. Тобто модифікатори ref та out також впливають на сигнатури методів у випадку їх перевантаження. Але дуже важливо зауважити, що методи, які різняться лише модифікаторами ref та out, компілятор не зможе перевантажити. Для ілюстрації спробуємо додати ще один метод MyMethod у клас Program:
public void MyMethod(out int x)
{
x = 100;
Console.WriteLine("Метод з цiлим параметром
out x = {0}", x);
}
Результатом компіляції буде повідомлення про помилку:
«MyMethod» cannot define overloaded methods that differs only on ref and out –
неможливо перевантажити методи, які розрізняються лише ref та out.
В той же час визначення та використання методу
public void MyMethod(out float x)
{
x = 100;
Console.WriteLine("Метод з дiйсним параметром
out x = {0}", x);
}
буде цілком успішним, адже два методи MyMethod(float x) та MyMethod(out float x) компілятор вважатиме «достатньо різними» і матиме можливість їх перевантаження.