Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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ę Calculator w przestrzeni nazw MathTools, 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 int i zwraca ich iloczyn jako int
      • Jedną, która przyjmuje trzy parametry int i zwraca ich iloczyn jako int
      • Jedną, która przyjmuje dwa parametry double i zwraca ich iloczyn jako double
    • Describe — utwórz dwie przeciążone wersje:
      • Jedną, która przyjmuje int i zwraca "Integer: {value}"
      • Jedną, która przyjmuje double i zwraca "Double: {value}"
  • Program.cs: W głównym pliku utwórz instancję klasy Calculator i 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:

  1. Pomnóż dwie pierwsze liczby całkowite (używa wersji przyjmującej dwie liczby typu int)
  2. Pomnóż wszystkie trzy liczby całkowite (używa wersji przyjmującej trzy liczby typu int)
  3. Pomnóż pierwszą liczbę całkowitą przez liczbę dziesiętną (używa wersji przyjmującej dwie liczby typu double)
  4. Opisz pierwszą liczbę całkowitą (używa wersji przyjmującej int)
  5. 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.5

Zauważ, ż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
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C# online