查找Perl类的所有超类的最佳实践是什么?

时间:2012-06-03 13:04:57

标签: perl oop superclass isa

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

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

4 个答案:

答案 0 :(得分:8)

没有“标准方式”,因为这不是您想要做的标准事情。对于除了可视化以外的任何东西,想要检查继承树是一个OO红旗。

除了Class :: ISA之外,还有mro::get_linear_isa()。两者都已经存在核心一段时间,所以它们可以被认为是某些定义的“标准”。这两个都将继承显示为一个平面列表,而不是一个树,这对于深层魔法很有用。

perl5i meta object同时提供linear_isa(),就像mro(它只调用mro)和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

答案 1 :(得分:4)

我认为Class::ISA就像你在寻找

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

打印:

Mojo
Mojo::Base

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如今,您最有可能想要使用mro中的一项功能,例如mro::get_linear_isa

use mro;
my @superclasses = mro::get_linear_isa($class);