Nie ma "standardowego sposobu", ponieważ nie jest to standardowa rzecz, którą chcesz zrobić. W przypadku czegokolwiek innego niż wizualizacja jest to czerwona flaga OO, która chce sprawdzić twoje drzewo dziedzictwa.
Oprócz Class :: ISA jest mro::get_linear_isa(). Oba są w rdzeniu przez jakiś czas, więc można je uznać za "standardowe" dla jakiejś definicji. Obaj pokazują spadek jako płaską listę, a nie drzewo, co jest przydatne głównie dla głębokiej magii.
perl5i meta object zapewnia zarówno linear_isa(), jak MRO (to właśnie nazywa MRO) oraz ISA() która zwraca klasę @ISA
. Można go użyć do skonstruowania drzewa za pomocą prostej rekursji bez przechodzenia do tabel symboli.
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
Czy to może być podstępne pytanie, na które odpowiedź brzmi: nie chcesz tego robić? Czasami powinieneś pozwolić, aby polimorfizm zrobił swoje. Zwykle nawet, być może. – tchrist
@tchrist - bez sztuczki. Nigdy nie musiałem tego robić (jak zauważyłem w twoim komentarzu i odpowiedziach, nie jest to coś, co zwykle powinno się robić); tak, że gdy trzeba rozważyć "jak" powstały podczas odpowiadania [to] (http://stackoverflow.com/questions/10869511/is-there-a-way-to-know-the-methods-of-an-instance -of-an-unknown-class-in-perl/10869712 # 10869712), stanąłem przed koniecznością wybrania implementacji AN. A ja mocno wierzę w TIMTOWTDIBSWABTO. – DVK