9

是否有一种标准的 CPAN 方法可以找出 Perl 类的所有超类(或者更好的是整个超类树,直到 UNIVERSAL)?

或者最好的做法是简单地检查@{"${$class}::ISA"}每个班级、班级的父母等?

4

4 回答 4

9

没有“标准方式”,因为这不是您想做的标准事情。对于除可视化之外的任何事情,想要检查您的继承树是一个面向对象的危险信号。

除了 Class::ISA,还有mro::get_linear_isa()。两者都处于核心地位已经有一段时间了,因此它们可以被认为是某些定义的“标准”。两者都将继承显示为平面列表,而不是树,这主要用于深度魔法。

perl5i元对象同时提供了linear_isa(),如 mro (它只是调用 mro)和返回 class' 的ISA()@ISA。它可用于使用简单的递归构造一棵树,而无需进入符号表。

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
于 2012-06-03T17:07:46.383 回答
5

我认为Class::ISA是你正在寻找的东西

use Class::ISA;
use Mojolicious;
print join "\n", Class::ISA::super_path("Mojolicious");

印刷:

Mojo
Mojo::Base

然而,这不是某种“最佳实践”,因为整个任务并不是 Perl 程序员每天都在做的事情。

于 2012-06-03T15:36:47.160 回答
1

这些天您很可能想使用其中的一个功能mro,例如mro::get_linear_isa.

use mro;
my @superclasses = mro::get_linear_isa($class);
于 2012-06-12T10:38:50.140 回答
0

我不相信有像“标准 CPAN 方式”这样的东西。检查@ISA是常见的做法 - 也是合理的,因为类似的技术use base qw(...)也适用use parent -norequire, ...@ISA......

于 2012-06-03T13:09:50.853 回答