C # перевантажуються методи - priler studio

C # перевантажуються методи - priler studio

Для початку слід визначитися з тим, що таке перевантажуються методи і як з ними працювати.

Перенавантажувані методи йдуть по шляху поліморфізму і також як і віртуальні методи, дозволяють перевизначати один і той же метод, з одним і тим же ім'ям.

Якщо бути точніше, то перевантажуються методи не переважають певний метод, а лише доповнюють його черговий зміненої копією.

Відразу наведемо приклад в коді, що б Вам було зрозуміліше.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication5
<
class Program
<
static void Main (string [] args)

//
some_func ();
some_func ( "Hello might");

public static void some_func ()

Console.WriteLine ( "Got no text");

public static void some_func (string some_text)

Console.WriteLine ( "Got text." + Some_text);

Наведений вище приклад виведе на екран наступні лінії:

Got text. Hello might

Тобто ми створили два однакових по імені методу, але з різними вхідними параметрами.

Це і називається перевантаженням методу, коли у одного методу є різні уявлення.

Але, як же їх слід розрізняти?

Досить просто, вони розрізняються по вхідних параметрів.

А якщо бути точніше, за типами вхідних параметрів або їх кількістю.

Тобто Ви можете оголосити хоч 100500 однакових методів, але вони повинні відрізнятися за кількістю вхідних параметрів, або по їх типу.

Наступний приклад наочно це демонструє.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication5
<
class Program
<
static void Main (string [] args)

//
some_func ();
some_func ( "Hello might");
some_func ( "Hello might", "How are you?");
some_func (100, 500);

public static void some_func ()

Console.WriteLine ( "Got no text");


public static void some_func (string some_text)

Console.WriteLine ( "Got text." + Some_text);


public static void some_func (string some_text, string some_text2)

Console.WriteLine ( "Got two lines." + Some_text + "-and-" + some_text2);


public static void some_func (int some_text, int some_text2)

Console.WriteLine ( "Got two numbers." + Some_text + "-and-" + some_text2);

Після запуску наведеного коду на екрані з'являться наступні написи:

Got text. Hello might

Got two lines. Hello might -and- How are you?

Got two numbers. 100 -and- 500

Як бачите, ми оголосили 4 однакових методу, але з різними параметрами.

C # сам дізнається, які передаються параметри і в якій кількості, після чого викликає той, який підходить за типом зазначених параметрів і / або їх кількості.

Навіщо це потрібно?

По-перше, це дуже зручно.

По-друге, покращує код.

По-третє, перевантажувати можна не тільки прості методи, але і конструктори класів, але про це нижче в статті.

А для більш наочного прикладу, наведемо мову C.

У C є метод ABS (), який повертає абсолютне значення цілого числа.

Також, в C є метод LABS (), який повертає абсолютне значення довгого цілого числа.

А ще в C є метод FABS (), який повертає абсолютне значення числа з плаваючою точкою звичайної (одинарної) точності.

Але, по суті, всі ці 3 функції виконують одну і ту ж задачу, лише розрізняючи по вхідних параметрів.

Це відбувається тому, що C не підтримує перевантажуються методи і доводиться кожну функцію і / або її копію називати унікальним ім'ям.

А в C # є всього одна функція ABS () в просторі імен System, в класі Math, і ця одна функція виконує функцію трьох перерахованих в C, ось чому можливість перевантажувати методи настільки зручна.

Що ховається під кіптяви?

C # вміє розрізняти перевантажуються функції і взагалі дозволяє з ними працювати завдяки сигнатурам.

Сигнатури позначають ім'я методу, а також його параметри, їх кількість і типи.

Таким чином, в C # один клас не може мати один і той же метод з однаковим кількість параметрів і / або типами параметрів.

Тип, що повертається методом не враховується в сигнатури, саме тому він ніяк не впливає на прийняття рішення мовою C #.

Також, на рішення C # не впливає модифікатор params.

Перевантаження констуктор класу.

Конструктор того, чи іншого класу також можна перевантажувати.

protected string animal_name;

public Animals ()
<
animal_name = "undefined";
Console.WriteLine ( "There is no name of animal");
>

public Animals (string name)
<
animal_name = name;
Console.WriteLine ( "Animal name is" + name);
>

public virtual void Print_Name ()
<
//
Console.WriteLine ( "Animal name is." + Animal_name);
>
>

І створюємо два примірника класу:

static void Main (string [] args)

//
Animals dog = new Animals ();
Animals cat = new Animals ( "Jonny Catsvill");
Console.ReadKey ();

В консолі з'явиться наступний текст:

There is no name of animal

Animal name is. Jonny Catsvill

Але, це лише прості приклади, в ділі ж перезавантаження конструкторів корисна, наприклад, для завдання стандартних значень полів і не дублювання одного і того ж коду.

Наприклад, один з перевантажуються констуктор може викликати іншу свою перевантажувати копію.

protected string animal_name;

public Animals (). this ( "Kvon Cho Wong")
<
>

public Animals (string name)
<
animal_name = name;
Console.WriteLine ( "Animal name is" + name);
>

public virtual void Print_Name ()
<
//
Console.WriteLine ( "Animal name is." + Animal_name);
>
>

При такому виклику:

static void Main (string [] args)

//
Animals dog = new Animals ();
Animals cat = new Animals ( "Jonny Catsvill");
Console.ReadKey ();

Виведе на екран наступний текст:

Animal name is. Kvon Cho Wong

Animal name is. Jonny Catsvill

Якщо Ви ставите питанням того, чи буде виконуватися тіло "порожнього" конструктора, то відповідь на це питання - так, буде, оскільки працює ця конструкція за принципом успадкування.

Тобто, коли Ви творця екземпляр класу Animals і не передаєте нічого в його параметрах, цей екземпляр конструкцією this звертається сам до себе і викликає свій же метод, але передає стандартне значення, тобто він викликає свою перевантажену копію.

А після того, як перевантажена копія закінчить свою роботу, управління знову повернеться до "пустому" конструктору, і його тіло виповниться.

Підводимо підсумки статті.

Ось такий от цікавий приклад.

З Вам був Прайлер. всього найкращого і приємного кодинга