Przeciążanie metod
Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 50 z 70.
Przeciążanie metod pozwala definiować wiele metod o tej samej nazwie, ale z różnymi listami parametrów. Kompilator określa, którą wersję wywołać, na podstawie przekazanych argumentów.
Każda przeciążona metoda musi mieć unikalną sygnaturę — inną liczbę parametrów lub różne typy parametrów:
public static void Print(string message)
{
Console.WriteLine(message);
}
public static void Print(string message, int times)
{
for (int i = 0; i < times; i++)
Console.WriteLine(message);
}
public static void Print(int number)
{
Console.WriteLine(number);
}// Kompilator wybiera odpowiednią wersję
Print("Hello"); // Wywołuje Print(string)
Print("Hi", 3); // Wywołuje Print(string, int)
Print(42); // Wywołuje Print(int)Przeciążanie różni się od parametrów opcjonalnych w istotny sposób. W przypadku parametrów opcjonalnych masz jedną metodę obsługującą wiele scenariuszy. Przy przeciążaniu masz osobne metody, które mogą zawierać zupełnie inną logikę dla każdego przypadku.
Pamiętaj, że sam typ zwracany nie sprawia, że metody są unikalne — nie możesz mieć dwóch metod, które różnią się tylko tym, co zwracają. Lista parametrów musi być inna. Przeciążanie metod jest formą polimorfizmu czasu kompilacji, w której decyzja o tym, którą metodę wywołać, jest podejmowana podczas kompilowania kodu, a nie podczas jego działania.
Wyzwanie
ŁatwyZbudujmy wszechstronną klasę kalkulatora, która pokaże możliwości przeciążania metod. Utworzysz wiele wersji metod obliczeniowych obsługujących różne scenariusze — od prostych działań na dwóch liczbach po bardziej złożone obliczenia — wszystkie z tymi samymi intuicyjnymi nazwami metod.
Rozmieścisz swój kod w dwóch plikach:
Calculator.cs: Utwórz klasęCalculatorw przestrzeni nazwMathTools, z przeciążonymi metodami, które mają te same nazwy, ale przyjmują różne parametry:Multiply— utwórz trzy przeciążone wersje:- Jedną, która przyjmuje dwa parametry
inti zwraca ich iloczyn jakoint - Jedną, która przyjmuje trzy parametry
inti zwraca ich iloczyn jakoint - Jedną, która przyjmuje dwa parametry
doublei zwraca ich iloczyn jakodouble
- Jedną, która przyjmuje dwa parametry
Describe— utwórz dwie przeciążone wersje:- Jedną, która przyjmuje
inti zwraca"Integer: {value}" - Jedną, która przyjmuje
doublei zwraca"Double: {value}"
- Jedną, która przyjmuje
Program.cs: W głównym pliku utwórz instancję klasyCalculatori pokaż, jak kompilator automatycznie wybiera odpowiednią przeciążoną metodę na podstawie przekazanych argumentów.
Otrzymasz cztery dane wejściowe:
- Pierwsza liczba całkowita (np.
5) - Druga liczba całkowita (np.
4) - Trzecia liczba całkowita (np.
3) - Liczba dziesiętna (np.
2.5)
Używając kalkulatora, wykonaj następujące operacje i wypisz każdy wynik w osobnym wierszu:
- Pomnóż dwie pierwsze liczby całkowite (używa wersji przyjmującej dwie liczby typu int)
- Pomnóż wszystkie trzy liczby całkowite (używa wersji przyjmującej trzy liczby typu int)
- Pomnóż pierwszą liczbę całkowitą przez liczbę dziesiętną (używa wersji przyjmującej dwie liczby typu double)
- Opisz pierwszą liczbę całkowitą (używa wersji przyjmującej int)
- Opisz liczbę dziesiętną (używa wersji przyjmującej double)
Na przykład, jeśli danymi wejściowymi są 5, 4, 3 i 2.5, wynikiem powinno być:
20
60
12.5
Integer: 5
Double: 2.5Zauważ, że wywołujesz Multiply i Describe z różnymi typami i liczbami argumentów, a mimo to kompilator za każdym razem dokładnie wie, której wersji użyć. To polimorfizm czasu kompilacji w praktyce — decyzja zapada podczas kompilowania kodu, a nie w trakcie jego działania!
Spróbuj swoich sił
using System;
using MathTools;
class Program
{
public static void Main(string[] args)
{
// Wczytaj dane wejściowe
int firstInt = Convert.ToInt32(Console.ReadLine());
int secondInt = Convert.ToInt32(Console.ReadLine());
int thirdInt = Convert.ToInt32(Console.ReadLine());
double decimalNum = Convert.ToDouble(Console.ReadLine());
// TODO: Utwórz instancję klasy Calculator
// TODO: Wywołaj Multiply z dwiema liczbami całkowitymi i wypisz wynik
// TODO: Wywołaj Multiply z trzema liczbami całkowitymi i wypisz wynik
// TODO: Wywołaj Multiply z pierwszą liczbą całkowitą i liczbą dziesiętną, a następnie wypisz wynik
// TODO: Wywołaj Describe z pierwszą liczbą całkowitą i wypisz wynik
// TODO: Wywołaj Describe z liczbą dziesiętną i wypisz wynik
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrznePrzestrzenie nazw i dyrektywyWprowadzenie do klas i obiektówSłowo kluczowe „this”Metody i parametryPola a właściwościKonstruktoryInicjalizatory obiektówPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawowa składnia dziedziczenia (:)Słowo kluczowe 'base'Słowa kluczowe virtual i overrideKlasy sealedBazowa klasa 'object'Powtórzenie – hierarchia pracowników7Zaawansowane funkcje
Przeciążanie operatorówIndeksery (this[])Nadpisywanie ToString()Metody rozszerzającePodsumowanie – własna lista2Właściwości i składowe statyczne
Właściwości automatyczneWłaściwości tylko do odczytu i zapisuPola i metody statyczneKlasy statyczneSkładowe z ciałem wyrażeniowym5Polimorfizm i interfejsy
Polimorfizm czasu kompilacji a czasu wykonaniaInterfejs a klasa abstrakcyjnaWiele interfejsówJawne implementowanie interfejsówRzutowanie w górę i w dółPowtórka — kalkulator kształtów8Zaawansowane koncepcje OOP
Kompozycja zamiast dziedziczeniaTypy generyczne (klasy i metody)Delegaty i zdarzeniaAtrybuty i refleksjaIDisposable i instrukcja usingPodstawy wstrzykiwania zależności11Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu3Architektura klas
Dane instancji a dane statyczneSłowa kluczowe 'readonly' i 'const'Pola zapasowePowtórzenie — menedżer kont bankowych6Hermetyzacja
Modyfikatory dostępuWłaściwości w hermetyzacjiImplementacja ukrywania danychWzorce niezmiennościPowtórka — dane studentów9Argumenty zmiennej liczby
Słowo kluczowe „params”Parametry opcjonalneArgumenty nazwanePrzeciążanie metodPoćwicz samodzielnie: Kompilator C# online