Co to jest przesłanianie metod?
Zastępowanie metod jest stosowane w programowaniu obiektowym w hierarchii dziedziczenia i ma miejsce, gdy metoda zdefiniowana w nadklasie zostanie ponownie zdefiniowana w podklasie. Zwykle metoda podklasy robi coś innego niż metoda nadklasy lub rozszerza się na jej możliwości, ale nie musi tak być. Zastępowanie metod występuje zawsze, gdy metoda nadklasy jest redefiniowana w podklasie, niezależnie od zawartości przedefiniowanej metody. Przedefiniowane podpisy metod muszą być dokładnie takie same.
Na przykład klasa A może zawierać metodę o nazwie „doSomething”, a ta metoda 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 przyjmuje liczbę jako parametr wejściowy. W tym przykładzie tylko klasa B wykazałaby zastąpienie metody, ponieważ jej metoda „doSomething” ma taką samą sygnaturę metody jak jej nadklasa, klasa A. Z drugiej strony metoda „doSomething” w klasie C wykazuje przeciążenie metody, ponieważ tworzy zupełnie nowa metoda.
Wirtualne dziedziczenie w C ++ jest kolejnym przykładem zastąpienia metody. Metody wirtualne w superklasach mogą, ale nie muszą być zaimplementowane, ale każda ich definicja podklasy jest przykładem zastąpienia metody. Gdy metoda zostanie zastąpiona w podklasie, metoda nadklasy nie zostanie wywołana, chyba że zostanie wywołana jawnie. Ten konkretny sposób wywoływania metody przesłoniętej często mówi się o „ukryciu” implementacji nadklasy.
Chociaż zastępowanie metod jest bardzo elastyczne, nie wszystkie metody można zastąpić, i są chwile, w których ta sztywność może być lepsza. Zarówno w języku Java, jak i C ++, w podpisach metod można zastosować określone słowa kluczowe, aby zapobiec zastąpieniu 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 zawsze pozostać niezmieniona w drzewie dziedziczenia.
Ogólnie rzecz biorąc, nie trzeba zastępować prostych metod, które uzyskują małe fragmenty danych. Przypadki, które zwykle czerpią najwięcej korzyści z zastąpienia, mają miejsce, gdy podklasa ma na celu dodanie funkcjonalności do metody nadklasy bez tworzenia całkowicie nowej metody. Nietypowe przypadki, w których należy całkowicie przerobić metodę dla jednego określonego typu obiektu, również mogą skorzystać z tej techniki. Ilekroć metoda jest nadpisywana, ważne jest, aby programista odpowiednio skomentował zarówno metody nadklasy, jak i metody podklasy. Idealnie, te komentarze powinny wyjaśnić, co robi każdy wariant metody, a także jak i dlaczego się różnią.