W Visual Basic przeciążenie metod (overloading) pozwala na tworzenie kilku metod o tej samej nazwie, ale z różnymi parametrami (typami, ilością, kolejnością). Do przeciążania używa się słowa kluczowego Overloads przed deklaracją metody. Pomaga to uczynić interfejs klasy bardziej elastycznym i wygodnym, umożliwiając użycie tej samej metody z różnymi zestawami parametrów. Nadpisanie (overriding) natomiast dotyczy dziedziczenia i pozwala w klasie pochodnej zmienić implementację metody klasy bazowej; do tego używa się słów kluczowych Overrides (w klasie pochodnej) i Overridable (w klasie bazowej).
Przykład przeciążenia metod:
Class MathUtil ' Przeciążenie dla sumy dwóch liczb całkowitych Public Overloads Function Add(a As Integer, b As Integer) As Integer Return a + b End Function ' Przeciążenie dla sumy trzech liczb całkowitych Public Overloads Function Add(a As Integer, b As Integer, c As Integer) As Integer Return a + b + c End Function ' Przeciążenie dla sumy dwóch liczb zmiennoprzecinkowych Public Overloads Function Add(a As Double, b As Double) As Double Return a + b End Function End Class
Pytanie: "Czy można przeciążać procedury i funkcje według typu zwracanego? Dlaczego?"
Odpowiedź: Nie, w Visual Basic przeciążenie metod jest dozwolone tylko według zestawu parametrów (typ, ilość, kolejność). Przeciążenie według typu wartości zwracanej jest niemożliwe: jeśli sygnatury metod różnią się tylko typem rezultatu, wystąpi błąd kompilacji.
Przykład:
' To spowoduje błąd kompilacji! Overloads Function Foo(x As Integer) As Integer End Function Overloads Function Foo(x As Integer) As String End Function
Historia
W projekcie internetowego bankingu programista zrealizował metody walidacji użytkownika poprzez przeciążenie, ale wybrał różnicę tylko według typu zwracanego (na przykład, jedna zwracała Boolean, druga String dla komunikatu o błędzie). Prowadziło to do niejednoznaczności w wywołaniu metody, niemożności kompilacji, i zespół musiał pilnie poprawić interfejs, co opóźniło wydanie.
Historia
W systemie korporacyjnym dla zapasów magazynowych próbowano zrealizować przeciążoną metodę AddItem, rozróżniając je według typu zwracanego rezultatu (na przykład, jeden — wynik dodania, drugi — ID dodanego wpisu). Po integracji z zewnętrznym API testy przestały się kompilować, ponieważ język nie wspiera takiego przeciążenia, i trzeba było całkowicie przemyśleć architekturę interakcji.
Historia
W starym projekcie do przetwarzania danych naukowych próbowano przeciążyć jedną funkcję według typu zwracanego (jedna Double, druga Decimal). Ekstancje wywołania okazały się nieodróżnialne dla kompilatora, co doprowadziło do nieoczekiwanych błędów w czasie wykonywania i podwójnej pracy nad poprawą interfejsu biblioteki.