Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl中的继承和默认构造函数_Perl_Oop_Inheritance - Fatal编程技术网

perl中的继承和默认构造函数

perl中的继承和默认构造函数,perl,oop,inheritance,Perl,Oop,Inheritance,我有以下代码:- package A; sub new{ //constructor for A } sub hello{ print "Hello A"; } 1; package B; use base qw(A); sub hello{ print "Hello B"; } 1; 我的问题是如何实例化B,即我的$B=B->new(),而不给B一个构造函数,我需要在a中做什么更改才能实现这一点。这可能吗 谢谢。是的。将此用作A的新方法: sub new { my

我有以下代码:-

package A;

sub new{
 //constructor for A
}

sub hello{
 print "Hello A";
}

1;

package B;
use base qw(A);

sub hello{
 print "Hello B";
}

1;
我的问题是如何实例化B,即我的$B=B->new(),而不给B一个构造函数,我需要在a中做什么更改才能实现这一点。这可能吗


谢谢。

是的。将此用作
A
新方法:

sub new {
    my ($cls, @args) = @_;
    # ...
    my $obj = ...;  # populate this
    bless $obj, $cls;
}

关键是当使用
B->new
时,第一个参数是
B
(在我的示例中,我绑定到
$cls
)。因此,如果您使用
$cls
调用
bless
,对象将获得正确的包。

根据Chris的回答,您的代码现在应该如下所示:

package A;
sub new{
    my ( $class ) = @_;
    my $self = {};
    bless $self, $class;
}
sub hello{
    print "Hello A";
}

package B;
use base qw(A);
sub hello{
    print "Hello B";
}

package main;
my $b = B->new;
$b->hello;

B
简单地继承
A
的构造函数。

次新的{my$self={};my$arg=shift;my$class=ref($arg)| |$arg;printf(“\n\tA的构造函数\n”);$self->{NAME}=“A”祝福($self,$class);返回$self;}请建议对上述内容进行修改method@AAB:因此,将代码中对
A
的所有引用更改为对
$class
的引用。e、 例如,
printf(“$class的构造函数”)
,和
$self->{NAME}=$class
,如果您愿意的话。我尝试在我的代码中使用以下内容:-我的$a=a->new()和我的$b=b->new(),但我在$b=b->new()上遇到以下错误,它说无法通过包“b”@AAB找到对象方法“new”,Perl已经有了一个b模块。避免使用这个名字。这会导致奇怪的错误。我尝试使用上面的代码,但我倾向于得到相同的错误,即无法通过包B找到新的对象方法