获得多级继承的根源

时间:2015-06-16 09:12:32

标签: perl inheritance

我的Perl模块中有以下继承

'Class::Accessor'
       |
'Class::Accessor::Fast'
       |
'MYAPP::MOD::Conf'
       |
'MYAPP::MOD'
       |
'MYAPP::MOD::Test'
       |
'MYAPP::MOD::Test::TestChild'
       |
'MYAPP::MOD::Test::TestGrandChild'

我希望通过某种方式让MYAPP::MOD的直接孩子获得MYAPP::MOD::Test::TestGrandChild。是否有可能没有硬编码深度?

就代码而言:

package MYAPP::MOD::Conf;
use base qw/Class::Accessor::Fast/;

package MYAPP::MOD;
use base qw(MYAPP::MOD::Configurable);

package MYAPP::MOD::Test;
use base qw(MYAPP::MOD);

package MYAPP::MOD::Test::TestChild;
use base qw(MYAPP::MOD::Test);

package MYAPP::MOD::Test::TestGrandChild;
use base qw(MYAPP::MOD::Test::TestChild);

1 个答案:

答案 0 :(得分:0)

您可以使用mro::get_linear_isa来获得线性继承链。如果在类中有多个继承,它将无法工作。

package AA;
use Moose;

package BB;
use Moose;
extends 'AA';

package CC;
use Moose;
extends 'BB';

package DD;
use Moose;
extends 'CC';

package main;
use Data::Printer;
use mro;

my @foo = mro::get_linear_isa("DD");
p @foo;

__END__
[
    [0] [
        [0] "DD",
        [1] "CC",
        [2] "BB",
        [3] "AA",
        [4] "Moose::Object"
    ]
]

另见Schwern's answerWhat is the best practice for finding out all superclasses of a Perl class?