我想在子类中替换父函数(Somefunc),所以当我调用Main过程时它应该失败。
Perl有可能吗?
代码:
package Test;
use strict;
use warnings;
sub Main()
{
SomeFunc() or die "Somefunc returned 0";
}
sub SomeFunc()
{
return 1;
}
package Test2;
use strict;
use warnings;
our @ISA = ("Test");
sub SomeFunc()
{
return 0;
}
package main;
Test2->Main();
答案 0 :(得分:4)
当您调用Test2->Main()
时,包名称将作为第一个参数传递给被调用函数。您可以使用该参数来解决正确的功能。
sub Main
{
my ($class) = @_;
$class->SomeFunc() or die "Somefunc returned 0";
}
在此示例中,$class
将为"Test2"
,因此您将致电Test2->SomeFunc()
。更好的解决方案是使用实例(即bless
Test::new
中的对象,使用$self
代替$class
)。更好的是使用Moose
,这解决了Perl中面向对象编程的许多问题。
答案 1 :(得分:3)
为了继承工作,您需要使用->
运算符将您的函数作为方法调用,无论是在类还是对象上。您似乎已经想到了对Test2->Main()
的调用,但是您希望以OO方式执行的所有方法必须以这种方式调用。
package Test;
use strict;
use warnings;
sub Main
{
my $class = shift;
$class->SomeFunc() or die "Somefunc returned 0";
}
sub SomeFunc
{
return 1;
}
package Test2;
our @ISA = ("Test");
sub SomeFunc
{
return 0;
}
package main;
Test2->Main();
有关详细介绍,请参阅perlboot,有关详情,请参阅perltoot。
此外,在声明子例程名称时,请不要将子句放在子例程名称之后 - 它不符合您的想法。