Man*_*pta 13 syntax perl inheritance
在下面的示例中,我有3种不同的语法/机制来定义继承.所有这些都有效.有人能告诉我哪一个是首选的,为什么(是的,我知道"有更多......").另外,为什么我需要在1例中使用"WB"而不是其他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);
}
Run Code Online (Sandbox Code Playgroud)
模块(湖泊,河流和海洋继承自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
Run Code Online (Sandbox Code Playgroud)
use parent 'Foo::Bar';
Run Code Online (Sandbox Code Playgroud)
是最干净的,虽然重复
use Foo::Bar qw( );
our @ISA = 'Foo::Bar';
Run Code Online (Sandbox Code Playgroud)
仍然是常用的.前者还具有比后者(当文件被执行时)更快(当编译文件时)发生的优点,尽管这很少发生.
不鼓励使用base,因为它可以消除加载模块时发生的错误.