如何获取对父 class 子例程 perl 的引用
How to get reference to parent class subroutine perl
我有一种情况,在子 class 中,我需要父 class 中定义的子例程的引用,我需要将其传递给其他 class 来执行它们。
所以我写了下面的示例模块来测试它们。
Parent1.pm
package Parent1;
sub new {
my ($class, $arg_hash) = @_;
my $self = bless $arg_hash, $class;
return $self;
}
sub printHello{
print "Hello\n";
}
sub printNasty{
print "Nasty\n";
}
1;
Child1.pm
package Child1;
use base Parent1;
sub new {
my ($class, $arg_hash) = @_;
my $self = bless $arg_hash, $class;
return $self;
}
sub testFunctionReferences{
my ($self) = @_;
# Case 1: Below 2 lines of code doesn't work and produces error message "Not a CODE reference at Child1.pm line 18."
#my $parent_hello_reference = \&$self->SUPER::printHello;
#&$parent_hello_reference();
# Case 2: Out of below 2 lines of code, 1st line executes the function and produces output of "Hello\n" but 2nd line doesn't work and produces error message "Not a CODE reference at Child1.pm line 23."
#my $parent_hello_reference2 = $self->SUPER::printHello;
#&$parent_hello_reference2();
# Case 3: does not work either. Says "Undefined subroutine &Child1::printNasty called at Child1.pm line 27"
#my $parent_nasty_reference = \&printNasty;
#&$parent_nasty_reference();
# Case 4: works. prints "World\n" as expected
#my $my_own_function_reference = \&printWorld;
#&$my_own_function_reference();
# Case 5: works. prints "Hello\n" and "Nasty\n" as expected
#$self->printHello();
#$self->SUPER::printNasty();
# Case 6: does not work produces error "Undefined subroutine &Child1::printHello called at Child1.pm line 38"
#printHello();
return;
}
sub printWorld{
print "World\n";
}
test.pl
#!/usr/bin/perl
use Child1;
my $child = Child1->new({});
$child->testFunctionReferences();
所以我的问题是:
与情况 1 一样,获取对父子例程的引用的正确语法是什么?
使用继承时,如何像案例6那样直接调用父函数?在perl中甚至可能吗?
当情况 5 有效时,为什么情况 6 不行?
如有任何见解,我们将不胜感激。谢谢
如果printHello
是一个子程序,使用
my $sub = \&Parent::printHello;
如果printHello
是一个方法,使用
# This line must appear inside of the Child package.
my $sub = sub { $self->SUPER::method(@_) };
如果你想要代码引用,你需要一个子程序来引用,这就创建了一个。
在这两种情况下,您都可以使用
调用子程序
&$sub();
或
$sub->();
(我觉得后者更干净,但它们在其他方面是等价的。)
我想出了另一种方法来使用 'UNIVERSAL' 模块 'can' 方法获取对父 class 子例程的引用。
#Parent.pm
package Parent;
sub new {
my ($class, $arg_hash) = @_;
my $self = bless $arg_hash, $class;
return $self;
}
sub printHello{
print "Parent Hello Called\n";
}
1;
#Child.pm
package Child;
use base Parent;
sub new {
my ($class, $arg_hash) = @_;
my $self = bless $arg_hash, $class;
return $self;
}
sub getParentSubReference{
my ($self) = @_;
return $self->can('printHello');
}
1;
#test.pl
#!/usr/bin/perl
use Child;
my $obj = Child->new({});
my $ref = $obj->getParentSubReference();
&$ref();
#Output
Parent Hello Called
我有一种情况,在子 class 中,我需要父 class 中定义的子例程的引用,我需要将其传递给其他 class 来执行它们。 所以我写了下面的示例模块来测试它们。
Parent1.pm
package Parent1;
sub new {
my ($class, $arg_hash) = @_;
my $self = bless $arg_hash, $class;
return $self;
}
sub printHello{
print "Hello\n";
}
sub printNasty{
print "Nasty\n";
}
1;
Child1.pm
package Child1;
use base Parent1;
sub new {
my ($class, $arg_hash) = @_;
my $self = bless $arg_hash, $class;
return $self;
}
sub testFunctionReferences{
my ($self) = @_;
# Case 1: Below 2 lines of code doesn't work and produces error message "Not a CODE reference at Child1.pm line 18."
#my $parent_hello_reference = \&$self->SUPER::printHello;
#&$parent_hello_reference();
# Case 2: Out of below 2 lines of code, 1st line executes the function and produces output of "Hello\n" but 2nd line doesn't work and produces error message "Not a CODE reference at Child1.pm line 23."
#my $parent_hello_reference2 = $self->SUPER::printHello;
#&$parent_hello_reference2();
# Case 3: does not work either. Says "Undefined subroutine &Child1::printNasty called at Child1.pm line 27"
#my $parent_nasty_reference = \&printNasty;
#&$parent_nasty_reference();
# Case 4: works. prints "World\n" as expected
#my $my_own_function_reference = \&printWorld;
#&$my_own_function_reference();
# Case 5: works. prints "Hello\n" and "Nasty\n" as expected
#$self->printHello();
#$self->SUPER::printNasty();
# Case 6: does not work produces error "Undefined subroutine &Child1::printHello called at Child1.pm line 38"
#printHello();
return;
}
sub printWorld{
print "World\n";
}
test.pl
#!/usr/bin/perl
use Child1;
my $child = Child1->new({});
$child->testFunctionReferences();
所以我的问题是:
与情况 1 一样,获取对父子例程的引用的正确语法是什么?
使用继承时,如何像案例6那样直接调用父函数?在perl中甚至可能吗?
当情况 5 有效时,为什么情况 6 不行?
如有任何见解,我们将不胜感激。谢谢
如果printHello
是一个子程序,使用
my $sub = \&Parent::printHello;
如果printHello
是一个方法,使用
# This line must appear inside of the Child package.
my $sub = sub { $self->SUPER::method(@_) };
如果你想要代码引用,你需要一个子程序来引用,这就创建了一个。
在这两种情况下,您都可以使用
调用子程序&$sub();
或
$sub->();
(我觉得后者更干净,但它们在其他方面是等价的。)
我想出了另一种方法来使用 'UNIVERSAL' 模块 'can' 方法获取对父 class 子例程的引用。
#Parent.pm
package Parent;
sub new {
my ($class, $arg_hash) = @_;
my $self = bless $arg_hash, $class;
return $self;
}
sub printHello{
print "Parent Hello Called\n";
}
1;
#Child.pm
package Child;
use base Parent;
sub new {
my ($class, $arg_hash) = @_;
my $self = bless $arg_hash, $class;
return $self;
}
sub getParentSubReference{
my ($self) = @_;
return $self->can('printHello');
}
1;
#test.pl
#!/usr/bin/perl
use Child;
my $obj = Child->new({});
my $ref = $obj->getParentSubReference();
&$ref();
#Output
Parent Hello Called