Over su StackOverflow mi sono trovato a consigliare il seguente schema. Vedo ha usato abbastanza spesso in produzione ma non ricordo di aver visto articoli o post di blog che ne discutano l'uso.
L'essenza è che fornisci un metodo di implementazione sovrascrivibile che non fa parte dell'API pubblica. Il metodo rivolto al pubblico non può essere ignorato e può fare alcune convalide, asserzioni ecc. Prima (o dopo) chiamando la funzione di implementazione effettiva. Forse in determinate condizioni deciderà di non chiamarlo affatto.
È difficile descrivere a parole, quindi spero che il seguente frammento di codice debba essere compreso da chi non ha esperienza Java. Il concetto dovrebbe essere applicabile a qualsiasi linguaggio polimorfico.
abstract class Animal //may be abstract or concrete
{
final public void eat()
{
if (isHungry)
{
eatImpl();
}
}
abstract protected void eatImpl();
}
class Dog extends Animal
{
@Override
protected void eatImpl()
{
// Nom nom nom
}
}
In questo caso, non vogliamo che Animal
s mangi se non hanno fame: forzare un cane a mangiare quando non aveva fame non sarebbe molto bello.
Questo modello ha un nome? Come si chiama?
L'ho sempre definito come "metodi differiti" che non penso sia molto descrittivo. Mentre scrivevo questa domanda, ho trovato " AOP for Dummies ".
Non mi piace la convenzione di denominazione xxxImpl()
ma sembra la più utilizzata in questo tipo di situazione.