我有一个名为Foo::Base的基类,我需要继承它的方法,比如'new‘,并在作用域中导入一些子例程的名称:
package Foo::Base;
sub new { ... }
sub import {
no strict 'refs';
my $caller = caller;
*{"${caller}::my_sub"} = sub { 1 };
}
1;因此,我需要在我的第二个类Foo::Child中使用这个基类:
use base 'Foo::Base';..。它适用于继承,但它不会在作用域中导入“my_sub”。我可以添加字符串
use Foo::Base;它很有帮助,但我不想写这样的东西:
use base 'Foo::Base';
use Foo::Base;这看起来有点奇怪..。对于这个问题有什么建议吗?
发布于 2012-10-20 01:41:47
在编写use base时,您将使用base模块的功能。你把你想要作为基类的模块的参数传递给它。
在OO IS-A关系中,不需要导入。使用OO模式调用方法:$object_or_class->method_name( @args )。有时这意味着你不关心调用者是谁,就像这样:
sub inherited_util {
my ( undef, @args ) = @_;
...
}或
sub inherited2 {
shift;
...
}但是,如果您希望使用在基本模块中定义的实用程序,并从该模块中定义的类行为继承,那么这正是两个use语句所表明的。
不过,如果您想在模块中使用两种不同类型的行为,最好将实用程序类型的东西拆分到各自的模块中,并在两个模块中使用它。无论哪种方式,显式的行为通常都比隐式的好。
但是,我以前使用过这个模式:
sub import {
shift;
my ( $inherit_flag ) = @_;
my $inherit
= lc( $inherit_flag ) ne 'inherit' ? 0
: shift() && !!shift() ? 1
: 0
;
if ( $inherit ) {
no strict 'refs';
push @{caller().'::ISA'}, __PACKAGE__;
...
}
...
}这样,我就可以使用显式绑定的用法进行一次调用。
use UtilityParent inherit => 1, qw<normal args>;https://stackoverflow.com/questions/12978971
复制相似问题