gpt4 book ai didi

打印时 Perl OO 父类(super class)变量未绑定(bind)到子类对象

转载 作者:行者123 更新时间:2023-12-02 07:13:39 25 4
gpt4 key购买 nike

我正在做一个 Perl OO 示例(主要是为了重新认识 Perl)并使用继承,似乎 SUPER 在调用父类(super class)构造函数时在子类中工作,并且父类(super class)变量不绑定(bind)到子类对象。为什么会这样?

################################################
## Package : Person ##
################################################
package Person;

################################################
## Constructor ##
################################################
sub new(){

my $class = shift;
my $data = {};
$data->{'firstName'} = shift;
$data->{'secondName'} = shift;
bless $data, $class;
#bless $data, "Person"; #hack
return $data;
}

################################################
## Getter Methods ##
################################################

sub getFirstName(){
my $data = shift;
return $data->{'firstName'};
}

sub getSecondName(){
my $data = shift;
return $data->{'secondName'};
}

################################################
## Setter methods ##
################################################

sub setFirstName($){
my $data = shift;
$data->{'firstName'} = shift;
}

sub setSecondName($){
my $data = shift;
$data->{'secondName'} = shift;
}

################################################
## Other Methods ##
################################################

sub printall(){
my $data = shift;
$\ = "\n";
print "FirstName: ". $data->{'firstName'} ."\n";
print "SecondName: ". $data->{'secondName'} ."\n";
}
1;

################################################
## Package : Coder ##
################################################

package Coder;
@ISA = qw( Person );
use strict;
use warnings;

################################################
## Constructor ##
################################################
sub new {
my $class = shift;
my $self = {};

bless $self, $class;
my $superFirstName = shift;
my $superSecondName = shift;

print "new superfirstname " .$superFirstName;
print "new supersecondname " .$superSecondName;

$self->{'language'} = shift; #i.e. Java
$self->{'experience'} = shift; #number of years

#$self = $self->SUPER::new($superFirstName, $superSecondName);
Person->new($superFirstName, $superSecondName);
return $self;
}

################################################
## Getter Methods ##
################################################

sub getLanguage(){
my $data = shift;
return $data->{'language'};
}

sub getExperience(){
my $data = shift;
return $data->{'experience'};
}

################################################
## Setter methods ##
################################################

sub setLanguage($){
my $data = shift;
$data->{'language'} = shift;
}

sub setExperience($){
my $data = shift;
$data->{'experience'} = shift;
}

################################################
## Other Methods ##
################################################

sub printall(){
my $data = shift;
$\ = "\n";

print "Experience: " . $data->{'experience'};
print "Language: " . $data->{'language'};

$data->SUPER::printall();

}
1;


################################################
## Package : Main ##
################################################
package main;

my $developer = Coder->new("John","Smith","Perl","2");

$developer->printall();

最佳答案

这是因为您没有对返回的 Person->new 做任何事情。所以它只是创建了一个完整 其他 Person 对象,然后 Coder 愉快地溜走了。

你想做的是

my $self = $class->SUPER::new( $superFirstName, $superSecondName );

并让 Person 祝福它进入您传递给它的任何类——就像它所做的那样。然后在以 SUPER 方式创建 $self 之后,您想要向其中添加所需的字段。

所以它看起来应该是这样的:

use strict;
use warnings;

sub new {
my $class = shift;
my $superFirstName = shift;
my $superSecondName = shift;
print "new superfirstname " .$superFirstName;
print "new supersecondname " .$superSecondName;

my $self = $class->SUPER::new( $superFirstName, $superSecondName );
# OR
# $self = $class->Person::new( $superFirstName, $superSecondName );

$self->{language} = shift; #i.e. Java
$self->{experience} = shift; #number of years

return $self;
}

关于打印时 Perl OO 父类(super class)变量未绑定(bind)到子类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3161962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com