Perl继承的首选约定是什么

时间:2016-05-30 08:29:50

标签: perl inheritance syntax

在下面的示例中,我有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

3 个答案:

答案 0 :(得分:16)

use parent pragma在编译时设置@ISA。来自parent

  

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

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

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)

操纵@ISA是最古老的方式。 base是第二种方式,parent甚至更新。所以,我建议parent用于新项目。