在下面的示例中,我有3种不同的语法/机制来定义继承。所有这些都有效。有人可以告诉我哪一个是首选的,为什么(是的,我知道"有更多...")。另外,为什么我需要"使用WB" 1例而不是其他2. TIA
主要 -
#!/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
答案 0 :(得分:16)
use parent
pragma在编译时设置@ISA
。来自parent
在编译时与基类建立ISA关系
当您use ParentClass;
然后手动设置在运行时发生的@ISA
。在这种情况下,BEGIN
,CHECK
或INIT
块中的代码无法在没有额外工作的情况下使用继承层次结构。
use base
编译指示较旧,文档中建议使用parent
。来自base
除非您使用字段pragma,否则请考虑使用此模块以支持较轻的父级
因此,我要说use parent
。
答案 1 :(得分:8)
use Foo::Bar qw( );
our @ISA = 'Foo::Bar';
是最干净的,虽然重复
function waitNseconds(n) {
var seconds = new Date().getTime() / 1000;
var time_now = seconds;
while ((time_now + n) > seconds)
{
seconds = new Date().getTime() / 1000;
}
}
仍然是常用的。前者的优势还在于(当编译文件时)比后者(文件执行时)更快发生,尽管这很少发生。
不鼓励使用base ,因为它可以消除加载模块时发生的错误。
答案 2 :(得分:7)