Ho un metodo String foo()
in una classe astratta che già esegue alcune precomputazioni ma non è in grado di fornire il risultato finale che si suppone che il metodo restituisca. Quindi quello che voglio è che ogni classe non astratta che eredita dalla mia classe astratta deve implementare foo
in un modo che viene chiamato prima super()
e quindi il risultato è calcolato. C'è un modo per forzare questo in Java?Forza il metodo non astratto da sovrascrivere
risposta
Sì, ridisegnando di utilizzare la template method pattern e comprendente un metodo astratto:
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();
}
In pratica se si vuole forzare sottoclassi per scavalcare un metodo, fa devono essere astratto - ma che doesn' t deve essere il metodo che viene chiamato da altro codice ...
C'è un convegno su come chiamare i due metodi? Darei loro lo stesso nome (che ovviamente non è possibile) perché fondamentalmente fanno la stessa cosa. –
@ principal-ideal-domain Lo fanno? Il metodo 'abstract' esegue una parte diversa dell'intero calcolo, quindi dovrebbe avere un nome corrispondente. Lo stesso nome potrebbe causare qualche incomprensione su come implementare il metodo astratto in una classe figlia. – Tom
@ Tom Sì, è vero. Esegue una parte diversa. Ma di solito chiamo i miei metodi da ciò che restituiscono e non da ciò che fanno. Per esempio nel mio caso attuale voglio solo contare il numero di chiamate al metodo, quindi il mio 'foo' sembra' counter ++; barra di ritorno(); '. A proposito: è possibile proibire la chiamata del metodo astratto nelle classi che la implementano? –
Non c'è modo di farlo in Java. Comunque puoi dichiarare un altro metodo che è astratto e chiamalo. Come questo:
public final String foo() {
String intermediate = ... // calculate intermediate result;
return calculateFinalResult(intermediate);
}
protected abstract String calculateFinalResult(String intermediate);
In questo modo si sarà costretti a ignorare calculateFinalResult
. Non è necessaria alcuna chiamata dell'istanza super
. Anche le sottoclassi non saranno in grado di ridefinire il tuo foo()
come dichiarato come final
.
Solo una nota: è una buona idea usare un adeguato ordinamento dei modificatori (ad esempio 'protected' e' abstract'). Puoi trovare l'ordinamento consigliato qui: https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.8.7-modificatori. – Tom
Qualcosa di simile?
public abstract class MyBean {
public final String foo(){
String preFinalResult = [...];
return doFinalResult(preFinalResult)
}
protected abstract String doFinalResult(String preFinal);
}
Potrebbe essere una buona idea cambiare il modificatore di 'doFinalResult' da' public' a 'protected', così le altre classi (tranne le classi e le classi figlio nello stesso pacchetto) non possono accedervi direttamente. – Tom
- 1. Un metodo astratto sovrascrive un metodo astratto
- 2. Sovrascrivere il metodo astratto o utilizzare un singolo metodo in enumerazione?
- 3. C++: creare una classe astratta con metodo astratto e sovrascrivere il metodo in una sottoclasse
- 4. Metodo astratto o virtuale?
- 5. parse classe anonima non implementa metodo astratto
- 6. sovraccarico ereditato metodo astratto
- 7. Java "astratto come" metodo con il corpo
- 8. Metodo astratto PHP rispetto al metodo predefinito
- 9. Come sovrascrivere il metodo getItemId (int pos) da CursorAdapter?
- 10. Ha senso sovrascrivere un metodo in un'interfaccia
- 11. Come ascoltare un metodo astratto?
- 12. Rails: sovrascrivere il metodo di associazione ActiveRecord
- 13. Perché sovrascrivere il metodo clone in Java
- 14. Una classe anonima può implementare il metodo non astratto della classe astratta?
- 15. Come sovrascrivere il metodo ORDER PL/SQL?
- 16. Chiamata metodo base forza
- 17. Metodo astratto con lista variabile di argomenti
- 18. Classe astratta senza alcun metodo astratto
- 19. È corretto chiamare il metodo astratto dal costruttore in Java?
- 20. Attributo astratto (non proprietà)?
- 21. Richiamo astratto nel metodo reflection di java
- 22. Come chiamare il metodo astratto della classe in java
- 23. Rails: come sovrascrivere: metodo destroy?
- 24. Forza git stash per sovrascrivere i file aggiunti
- 25. La classe non è astratta e non sovrascrive il metodo astratto onClick (Visualizza) in OnClickListener
- 26. Sovrascrittura del metodo di interfaccia predefinito con metodo astratto
- 27. OOP (PHP) - Forza il metodo sovrascritto per chiamare secondo metodo genitore
- 28. Forza sovrascrivere Branch esistente manca TortoiseGit spinta dialogo
- 29. Perché Java.Lang.Math non è astratto?
- 30. Forza modulo da ridisegnare?
si prega di condividere la firma del metodo per foo –
, farla chiamare un metodo astratto che deve sia eseguire i calcoli finali o valore di ritorno (s) che ha bisogno di – MadProgrammer