Przeciążanie funkcji

Choć przeciążanie funkcji brzmi trochę jak przeciążanie samochodu, to jednak chodzi o coś innego.

Dzięki przeciążeniu możemy mieć kilka funkcji o tej samej nazwie, ale przyjmującej różną liczbę argumentów.

Przykład

Zacznijmy od prostego przykładu: aplikacja konsolowa, a niej dwie funkcje, które służą do dodawania kilku liczb całkowitych. Jedna z funkcji potrafi dodać do siebie dwie liczby, druga funkcja potrafi dodawać trzy liczby:

public class Main {

    public static void main(String[] args) {

        Integer suma2Liczb = dodaj2Liczby(1, 2);
        System.out.println(suma2Liczb);

        Integer suma3Liczb = dodaj3Liczby(1, 2, 3);
        System.out.println(suma3Liczb);
    }

    public static Integer dodaj2Liczby(Integer a, Integer b) {
        return a + b;
    }

    public static Integer dodaj3Liczby(Integer a, Integer b, Integer c) {
        return a + b + c;
    }
}

Uruchom powyższy przykład w Repl.it

Jak widać powyżej obydwie funkcje są bardzo proste. Jedyne co robią, to biorą przekazane do funkcji liczby i je sumują.

Ale widać też, że musimy pamiętać, jak nazywa się funkcja, która potrafi dodawać dwie liczby i jak się nazywa funkcja do dodawania trzech liczb.

A co jak będziemy musieli dodać jeszcze kilka podobnych funkcji, bo każda z nich będzie potrafiła sumować inną liczbę argumentów. Będzie to bardzo trudne w używaniu, przede wszystkim z tego powodu, że nikt nie spamięta nazw funkcji. Będzie ich po prostu za dużo.

Przeciążenia

W takim przypadku warto użyć mechanizmu przeciążenia: dzięki temu, że obie funkcje przyjmują inną listę argumentów (jedna funkcja spodziewa się dwóch liczb, druga spodziewa się ich trzech), to możemy obie funkcje nazwać tak samo:

package pl.coderion;

public class Main {

    public static void main(String[] args) {

        Integer suma2Liczb = dodaj(1, 2);
        System.out.println(suma2Liczb);

        Integer suma3Liczb = dodaj(1, 2, 3);
        System.out.println(suma3Liczb);
    }

    public static Integer dodaj(Integer a, Integer b) {
        return a + b;
    }

    public static Integer dodaj(Integer a, Integer b, Integer c) {
        return a + b + c;
    }
}

Uruchom powyższy przykład w Repl.it

Skąd Java wie, czy użyć pierwszej czy drugiej funkcji? To proste.

Jeśli do funkcji dodaj() przekażemy dwie liczby, to wykonana zostanie ta wersji funkcji, która spodziewa się dwóch argumentów. Jeśli przekażemy trzy, to wykonana zostanie druga funkcja, ta która spodziewa się trzech argumentów.

Dzięki temu nie musimy pamiętać wielu różnych nazw funkcji. Wystarczy zapamiętać jedną nazwę funkcji (dodaj()), podać właściwą liczbę argumentów i działa.

Przy przeciążaniu ważne jest tylko to, by kolejne wersje funkcji (lub metody) różniły się czymś od poprzednich. To znaczy by miały albo inną liczbę argumentów, których funkcja się spodziewa albo by były to argumenty innego typu.

W następnym odcinku zmierzymy się z tym, co zrobić, by mieć jedną funkcję do sumowania bez względu na to, ile argumentów podamy. Np. jedna osoba będzie chciała dodać do siebie tylko dwie liczby, inna trzy liczba, a jeszcze inna zechce dodać do siebie 100 liczb. Nie trzeba będzie robić wielu różnych funkcji tylko dlatego, że za każdym razem będziemy mieli do czynienia z różną liczbą argumentów. Wystarczy do tego jedna funkcja.