Myślę, że może to być przydatna funkcja językowa i zastanawiałem się, czy którykolwiek język już ją obsługuje.
Chodzi o to, jeśli masz:
class C
virtual F
statement1
statement2
i
class D inherits C
override F
statement1
statement2
C.F()
Do CF () zastosowane byłoby słowo kluczowe takie, że usunięcie ostatniego wiersza kodu powyżej spowodowałoby błąd kompilatora, ponieważ mówi on: „Metodę tę można zastąpić, ale implementacja tutaj musi działać bez względu na wszystko”.
programming-languages
Aaron Anodide
źródło
źródło
Odpowiedzi:
Tak, robią. Nazywa się to skandynawskim modelem OO, jest on używany na przykład w Simula (drugi model OO, który jest szeroko rozpowszechniony i przyjęty jako przyznany teraz, to model amerykański). W modelu skandynawskim nie zastępujesz, ale zapewniasz pod-zachowanie.
w metodzie Superclass foo:
w metodzie podklasy foo:
Jeśli wywołanie metody foo SuperClass' instancje, tylko
some-code-before
isome-code-after
zdarza się (INNER
nic nie robi), ale jeśli zadzwonisz podklasy foo instancje, to robisome-code-before
,some-code-in-subclass
a potemsome-code-after
.źródło
Żaden znany mi język nie wymusza wywoływania metody przesłoniętej. Rzeczywiście, niektóre języki pozwalają na przesłanianie metod, których nie można zastąpić (takich jak użycie
new
słowa kluczowego w języku C #). Istnieją jednak dwa sposoby podejścia do tego.Pierwszym z nich jest stworzenie metody niemożliwej do zastąpienia (np. Takiej, w której brakuje
virtual
słowa kluczowego w języku C # lub takiej, która mafinal
słowo kluczowe w Javie), która wywołuje metodę nadrzędną, której nie można wywołać spoza klasy (np.protected
W języku C #, Java lub C ++).i
Przesłanianie klas
C
może dowolnie zastępowaćF
i modyfikować jego zachowanie, ale wywołujący spoza klasy mają do niego dostęp tylko poprzezA
.Edycja: jak zauważyli inni, jest to tak zwany wzorzec metody szablonu .
Drugim sposobem jest użycie języka, który wymusza warunki wstępne i dodatkowe określone w klasie podstawowej, takie jak Eiffel lub C # z kontraktami kodowymi. Nie wymusi to wywołania klasy bazowej, ale przesłonięta metoda może zostać zmuszona do wykonania tych samych instrukcji. Korzystanie z aspektów może również pomóc, jeśli język pozwala na dziedziczenie aspektów.
źródło
private
w C ++ :) Herb Sutter wyjaśnia ją tutaj szczegółowo.Nie jest to część języka, ale analizator kodu statycznego FindBugs dla Javy ma adnotację,
OverrideMustInvoke
którą programista może dodać do metody, i która spowoduje, że FindBugs wyświetli błąd, jeśli znajdzie nadrzędną metodę, która nie wywołuje super-implementacji . Pozwala nawet określić, czy wywołanie musi być pierwsze czy ostatnie w metodzie zastępowania.źródło
Wymaganie wywołania metody nadklasy jest anty-wzorcem . Jeśli nie jest wymuszony w czasie kompilacji, jest podatny na błędy, dlatego szukasz konstruktora języka, który to sprawdza.
Istnieje sposób obsługiwany we wszystkich językach OO: wzorzec metody szablonu . Tutaj sprawiasz, że metoda nadklasy nie jest nadpisywalna, a w niej wywołujesz metodę nadpisywalną. Następnie podklasa może zastąpić tę metodę, aby dodać funkcjonalność:
W zależności od lokalizacji wywołania metody zastępowanej pozwala nawet określić kolejność wykonywania, która w przypadku zwykłego super wywołania jest do woli implementatora podklasy.
źródło
Najbliższy wzorzec, jaki mogę wymyślić, to subskrybowane zdarzenia. Jest to trochę kłopotliwe i wcale nie intuicyjne dla programisty, ale osiąga cel.
źródło
„Smaki” maszyny Lisp dopuszczały metody typu „przed”, „po” i „wokół” odziedziczonej metody głównej.
źródło
Chociaż teoretycznie nie jest to zły pomysł, ma negatywny efekt uboczny, ograniczając moje opcje podczas wdrażania
D
. Na przykład, co jeśli (z jakiegoś niezgłębionego powodu) wygodniej jest wywołać implementację nadklasyF
z innej metody:W twoim scenariuszu wyobrażam sobie, że kompilator oznaczałby implementację parametru
F
inD
, nawet jeśli wywołuje (pośrednio)C.F()
.Zasadniczo to, co opisałeś, jest możliwym mechanizmem pomagającym kompilatorowi w rozpoznaniu, kiedy
C
zostanie naruszona umowa dotycząca dziedziczących klas . Chodzi mi o to, że chociaż jest to świetna rzecz, nie powinno to odbywać się kosztem ograniczenia, w jaki sposób mogę wdrożyć moją podklasę.źródło