首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl继承的首选约定是什么?

Perl继承的首选约定是什么?
EN

Stack Overflow用户
提问于 2016-05-30 08:29:50
回答 3查看 654关注 0票数 13

在下面的示例中,我有3种不同的语法/机制来定义继承。他们都能工作。有人能告诉我哪一个是首选的吗?为什么(是的,我知道“不止.”)。另外,为什么我在一种情况下需要“使用WB”而不是其他的2。

主要是-

代码语言:javascript
复制
#!/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):

代码语言:javascript
复制
######################
# 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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-30 09:02:59

use parent实用程序在编译时设置@ISA。来自父级

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

当您use ParentClass;并手动设置运行时发生的@ISA时。在本例中,如果没有额外的工作,BEGINCHECKINIT块中的代码将无法使用继承层次结构。

use base实用程序比较老,parent在文档中是推荐的。来自基座

除非您使用的是字段务实,否则请考虑该模块对轻量级父级的支持。

因此,我会说,去与use parent

票数 17
EN

Stack Overflow用户

发布于 2016-05-30 08:45:17

操纵@ISA是最古老的方式。基座是第二种方式,而父级则更新。因此,我建议在新项目中使用parent

票数 8
EN

Stack Overflow用户

发布于 2016-05-30 17:12:12

代码语言:javascript
复制
use parent 'Foo::Bar';

是最干净的,尽管重复

代码语言:javascript
复制
use Foo::Bar qw( );
our @ISA = 'Foo::Bar';

仍然是常用的。前者还具有比后者(执行文件时)更早(文件被编译时)发生的优点,尽管这很少重要。

基类被阻止,因为它会阻止在加载模块时发生的错误。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37521028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档