Mam metodę String foo()
w klasie abstrakcyjnej, która wykonuje już kilka obliczeń, ale nie może dostarczyć końcowego wyniku, który metoda ma zwrócić. Tak więc chcę, aby każda nie abstrakcyjna klasa dziedzicząca z mojej abstrakcyjnej klasy musiała implementować foo
w sposób, w jaki jest wywoływana pierwsza super()
, a następnie obliczany jest wynik. Czy istnieje sposób, aby zmusić to w java?Wymuszenie zastąpienia metody nie abstrakcyjnej
Odpowiedz
Tak, przez przeprojektowanie używać template method pattern włącznie abstrakcyjną metodę:
public abstract class AbstractSuper {
public final String foo() {
// Maybe do something before calling bar...
String initialResult = bar();
// Do something common, e.g. validation
return initialResult;
}
protected abstract String bar();
}
Zasadniczo, jeśli chcesz wymusić podklasy zastąpić metodę, to robi muszą być abstrakcyjne - ale to nie robi” t musi być metodą, która jest wywoływana przez inny kod ...
Czy istnieje konwencja, w jaki sposób wywołać na dwa sposoby? Nadałbym im to samo imię (co oczywiście nie jest możliwe), ponieważ w zasadzie robią to samo. –
@ principal-ideal-domain Czy oni? Metoda "abstrakcyjna" wykonuje inną część całego obliczenia, więc powinna mieć odpowiednią nazwę. Ta sama nazwa może powodować pewne nieporozumienia dotyczące sposobu implementacji metody abstrakcyjnej w klasie potomnej. – Tom
@Tom Tak, to prawda. Wykonuje inną część. Ale zwykle nazywam swoje metody tym, co powracają, a nie tym, co robią. Na przykład w moim obecnym przypadku chcę tylko policzyć liczbę wywołań metod, więc moje 'foo' wygląda jak' counter ++; pasek powrotu(); '. Przy okazji: Czy można zabronić wywoływania abstrakcyjnej metody w klasach, które ją implementują? –
Nie ma sposobu, aby to zrobić w Javie. Możesz jednak zadeklarować jeszcze jedną metodę, która jest abstrakcyjna i wywołaj ją. Tak:
public final String foo() {
String intermediate = ... // calculate intermediate result;
return calculateFinalResult(intermediate);
}
protected abstract String calculateFinalResult(String intermediate);
ten sposób będziesz zmuszony zastąpić calculateFinalResult
. Nie jest wymagane wywoływanie instancji super
. Również podklasy nie będą w stanie przedefiniować twojego foo()
, ponieważ jest zadeklarowany jako final
.
Uwaga: dobrze jest użyć odpowiedniego sortowania modyfikatorów (np. 'Protected' i' abstract'). Zalecane sortowanie można znaleźć tutaj: https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.8.7-modyfikatory. – Tom
Coś takiego?
public abstract class MyBean {
public final String foo(){
String preFinalResult = [...];
return doFinalResult(preFinalResult)
}
protected abstract String doFinalResult(String preFinal);
}
Dobrym pomysłem może być zmiana modyfikatora 'doFinalResult' z' public' na 'protected', więc inne klasy (z wyjątkiem klas potomnych i klas w tym samym pakiecie) nie będą miały do niego bezpośredniego dostępu. – Tom
- 1. Korzystanie z metody abstrakcyjnej klasy
- 2. Definiowanie metody abstrakcyjnej bez określania parametrów
- 3. Różne metody zwracania metody abstrakcyjnej w języku Java bez odlewania
- 4. Zastępowanie domyślnej metody interfejsu za pomocą metody abstrakcyjnej
- 5. Metoda wywołania podstawowego zamiast zastąpienia
- 6. Wymuszenie odżegnania
- 7. Wymuszenie pojedynczego wzorca w podklasach
- 8. rodzajowych Java, aby wymusić typ zwracany abstrakcyjnej metody
- 9. Jak zmusić dziecko klasy abstrakcyjnej do wdrożenia metody statycznej?
- 10. Rozwiąż Java Generic typ błędu z klasy abstrakcyjnej metody
- 11. Określanie typu zwracanej abstrakcyjnej metody z klasy bazowej według PODKLASA
- 12. zastąpienia licznych wystąpień znaków
- 13. InnerHTML dołączyć zamiast zastąpienia
- 14. Regex do zastąpienia bełkotu
- 15. Wymuszenie odczytu zmiennej lotnej
- 16. Czy można odwołać się do metody klasy abstrakcyjnej w metodzie klasy, która jej nie rozszerza?
- 17. Dlaczego nie możemy utworzyć instancji interfejsu lub klasy abstrakcyjnej w języku Java bez metody anonimowej klasy?
- 18. Wymuszenie lokalizacji gałązki
- 19. Wymuszenie łosia i budowniczowie
- 20. Wymuszenie pobrania ASP.Net
- 21. PHP zastąpienia znaków w tablicy
- 22. JavaScript innerHTML dodając zamiast zastąpienia
- 23. instancja klasy abstrakcyjnej
- 24. Konwertowanie drzewa składni abstrakcyjnej na kod bajtu
- 25. CSS: Nie można zastąpienia dziedziczonych text-decoration nieruchomość
- 26. Określa, czy nie można wykluczyć konstruktora abstrakcyjnej klasy bazowej?
- 27. Wymuszenie zainicjowania pliku HwndHost
- 28. Wymuszenie wyczerpującego przełącznika
- 29. Wymuszenie niepowodzenia testu jaśminowego
- 30. Wymuszenie odświeżenia obrazu tła
proszę podzielić podpis metody dla foo –
Czy to nazwać abstrakcyjną metodę, która musi albo wykonać ostateczne obliczenia lub wartość (y) return że musi – MadProgrammer