在下面的示例中,我有3种不同的语法/机制来定义继承。他们都能工作。有人能告诉我哪一个是首选的吗?为什么(是的,我知道“不止.”)。另外,为什么我在一种情况下需要“使用WB”而不是其他的2。
主要是-
#!/usr/local/bin/perl -w
#######################
use strict;
use River;
use Ocean;
use Lake;
my $pName = $0; $pName =~ s/.*\///; $pName =~ s/\.\w+$//;
my @sources = (Ocean->new ('Pacific', 1),
River->new ('Brazos', 0),
Lake->new ('Tahoe', 0) );
foreach (@sources) {
$_->printIfSaline ($pName);
}模块(湖泊、河流和海洋继承自WaterBody):
######################
# File: Lake.pm
######################
package Lake;
use strict;
use WaterBody;
our @ISA = ('WaterBody');
sub new {
my $class = shift;
$class->SUPER::new(@_)
}
sub printIfSaline {
my ($self, $prompt) = @_;
my $name = $self->getName();
my $taste = $self->isSaline() ? "salty" : "sweet";
print "$prompt: Lake $name has $taste water\n";
}
1
######################
# File: Ocean.pm
######################
package Ocean;
use strict;
use parent 'WaterBody';
sub new {
my $class = shift;
$class->SUPER::new(@_);
}
sub printIfSaline {
my ($self, $prompt) = @_;
my $name = $self->getName;
my $taste = $self->SUPER::isSaline() ? "salty" : "sweet";
print "$prompt: $name Ocean has $taste water\n";
}
1
######################
# File: River.pm
######################
package River;
use strict;
use base 'WaterBody';
sub new {
my $class = shift;
$class->SUPER::new(@_);
}
sub printIfSaline {
my ($self, $prompt) = @_;
my $name = $self->getName;
my $taste = $self->isSaline ? "salty" : "sweet";
print "$prompt: $name river has $taste water\n";
}
1
######################
# File: WaterBody.pm
######################
package WaterBody;
sub new {
my $class = shift;
my $self = {};
$self->{name} = shift;
$self->{saline} = shift;
bless $self, $class;
return $self;
}
sub getName {
my ($self) = @_;
$self->{name}
}
sub isSaline {
my ($self) = @_;
$self->{saline}
}
1发布于 2016-05-30 09:02:59
use parent实用程序在编译时设置@ISA。来自父级
在编译时与基类建立ISA关系
当您use ParentClass;并手动设置运行时发生的@ISA时。在本例中,如果没有额外的工作,BEGIN、CHECK或INIT块中的代码将无法使用继承层次结构。
use base实用程序比较老,parent在文档中是推荐的。来自基座
除非您使用的是字段务实,否则请考虑该模块对轻量级父级的支持。
因此,我会说,去与use parent。
发布于 2016-05-30 08:45:17
操纵@ISA是最古老的方式。基座是第二种方式,而父级则更新。因此,我建议在新项目中使用parent。
发布于 2016-05-30 17:12:12
use parent 'Foo::Bar';是最干净的,尽管重复
use Foo::Bar qw( );
our @ISA = 'Foo::Bar';仍然是常用的。前者还具有比后者(执行文件时)更早(文件被编译时)发生的优点,尽管这很少重要。
基类被阻止,因为它会阻止在加载模块时发生的错误。
https://stackoverflow.com/questions/37521028
复制相似问题