Non esiste un "metodo standard" perché non è una cosa standard che si desidera eseguire. Per qualsiasi cosa diversa dalla visualizzazione, è una bandiera rossa OO per voler ispezionare il tuo albero ereditario.
In aggiunta alla classe :: ISA, c'è mro::get_linear_isa(). Entrambi sono stati al centro per un po ', quindi potrebbero essere considerati "standard" per alcune definizioni. Entrambi mostrano ereditarietà come una lista piatta, non un albero, che è utile soprattutto per la magia profonda.
Il perl5i meta object fornisce sia linear_isa(), come MRO (solo chiamate MRO), e ISA() che restituisce la classe @ISA
. Può essere usato per costruire un albero usando la ricorsione semplice senza entrare nelle tabelle dei simboli.
use perl5i::2;
func print_isa_tree($class, $depth) {
$depth ||= 0;
my $indent = " " x $depth;
say $indent, $class;
for my $super_class ($class->mc->ISA) {
print_isa_tree($super_class, $depth+1);
}
return;
}
my $Class = shift;
$Class->require;
print_isa_tree($Class);
__END__
DBIx::Class
DBIx::Class::Componentised
Class::C3::Componentised
DBIx::Class::AccessorGroup
Class::Accessor::Grouped
Questa è forse una domanda trabocchetto la cui risposta è che non vuoi farlo? A volte dovresti lasciare che il polimorfismo faccia il suo esempio. Di solito anche, forse. – tchrist
@tchrist - nessun trucco. Non ho mai dovuto farlo (come notato dal tuo commento e dalle risposte, non è qualcosa che si dovrebbe fare di solito); in modo che quando la necessità di considerare "come" è sorto quando si risponde a [questo] (http://stackoverflow.com/questions/10869511/is-there-a-----------modifica-di-metodi-di-an-instance -of-an-unknown-class-in-perl/10869712 # 10869712), mi sono trovato di fronte alla necessità di scegliere un'implementazione AN. E credo fermamente in TIMTOWTDIBSWABTO. – DVK