我的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);
答案 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 answer至What is the best practice for finding out all superclasses of a Perl class?。