Co to jest zastępowanie metody?

Nadpisywanie metod jest używane w programowaniu obiektowym w ramach hierarchii dziedziczenia i występuje, gdy metoda zdefiniowana w nadklasie jest przedefiniowana w podklasie. Zwykle metoda podklasy robi coś innego niż metoda nadklasy lub rozszerza możliwości nadklasy, ale nie musi tak być. Zastępowanie metod ma miejsce za każdym razem, gdy metoda nadklasy jest przedefiniowana w podklasie, niezależnie od treści przedefiniowanej metody. Przedefiniowane sygnatury metod muszą być dokładnie takie same.

Na przykład klasa A może zawierać metodę o nazwie „doCoś”, która nie przyjmuje parametrów wejściowych. Ponadto klasy B i C mogą być podklasami klasy A. Klasa B może zawierać metodę o nazwie „doSomething”, która nie przyjmuje parametrów wejściowych, a klasa C może zawierać metodę „doSomething”, która jako parametr wejściowy przyjmuje liczbę. W tym przykładzie tylko klasa B zademonstrowałaby przesłonięcie metody, ponieważ jej metoda „doSomething” ma taką samą sygnaturę metody jak jej nadklasa, klasa A. Z drugiej strony metoda „doSomething” w klasie C demonstruje przeciążanie metody, ponieważ tworzy zupełnie nowa metoda.

Dziedziczenie wirtualne w C++ to kolejny przykład nadpisywania metod. Metody wirtualne w nadklasach mogą, ale nie muszą być zaimplementowane, ale każda ich definicja podklasy jest instancją przesłaniania metody. Gdy metoda jest nadpisywana w podklasie, metoda nadklasy nie jest wywoływana, chyba że zostanie wywołana jawnie. Często mówi się, że ten konkretny sposób wywoływania nadpisanej metody „ukrywa” implementację nadklasy.

Chociaż nadpisywanie metod jest bardzo elastyczne, nie wszystkie metody można nadpisać, a czasami taka sztywność może być preferowana. Zarówno w Javie, jak i C++ w sygnaturach metod można zastosować określone słowa kluczowe, aby zapobiec przesłonięciu metody w podklasie. Aby to zrobić, Java używa słowa kluczowego „final”, a C++ używa słowa kluczowego „const”. Zapobieganie zastępowaniu metod może być korzystne, jeśli dana funkcja powinna być zawsze niezmieniona w całym drzewie dziedziczenia.

Ogólnie rzecz biorąc, proste metody, które pobierają małe fragmenty danych, nie powinny być zastępowane. Przypadki, które zwykle odnoszą największe korzyści z zastępowania, to sytuacje, w których podklasa ma na celu dodanie funkcjonalności do metody nadklasy bez tworzenia całkowicie nowej metody. Nietypowe przypadki, w których metoda musi zostać całkowicie przerobiona dla jednego konkretnego typu obiektu, również mogą skorzystać na tej technice. Za każdym razem, gdy metoda jest nadpisywana, ważne jest, aby programista odpowiednio skomentował zarówno metody nadklasy, jak i podklasy. W idealnym przypadku komentarze te powinny wyjaśniać, co robi każdy wariant metody, a także w jaki sposób i dlaczego się różnią.