Questo è comune nel Modello di strategia :
abstract class Strategy {
void stepA();
void stepB();
void execute() {
stepA();
stepB();
}
}
class SpecificStategy extends Strategy {
void stepA() { ... }
void stepB() { ... }
}
new SpecificStrategy().execute();
Anche il concetto di tratti è costruito attorno a questo: un tratto è simile a una classe base astratta in quanto può definire implementazioni e interfacce dei metodi richiesti, che una classe di implementazione deve fornire.
Alcuni sistemi oggetto come CLOS (per Common Lisp) o Alci (per Perl) hanno anche la possibilità che un metodo possa riferirsi a inner
, che è l'implementazione di questo metodo in una sottoclasse. Se nessuna sottoclasse fornisce un'altra implementazione, allora è un no-op. Qui, definire un metodo con lo stesso nome è diverso dall'override del metodo. Perl esempio:
package Report {
use Moose;
sub display {
say "Some title:";
say "";
inner();
say " - $_" for qw< foo bar baz >;
}
}
package SpecificReport {
use Moose;
extends 'Report';
# "augment" avoids overriding the parent implementation
augment display => sub {
say "some paragraph";
say "";
inner();
};
}
SpecificReport->display;
Output:
Some title:
some paragraph
- foo
- bar
- baz