Perl继承的首选约定是什么

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)

zdi*_*dim 17

use parent编译指示@ISA在编译时设置.来自父母

在编译时与基类建立ISA关系

当您use ParentClass;然后手动设置@ISA在运行时发生的情况.在这种情况下,代码in BEGIN,CHECK或者INIT块将无法在没有额外工作的情况下使用继承层次结构.

use basepragma较旧,parent建议在docs中使用.从基地

除非您使用的是字段pragma,否则请考虑使用此模块,而不是使用较轻的父级

因此,我会说use parent.


cho*_*oba 8

操纵@ISA是最古老的方式.基地是第二种方式,父母甚至更新.所以,我建议parent新项目.


ike*_*ami 8

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,因为它可以消除加载模块时发生的错误.