当前位置:  开发笔记 > 编程语言 > 正文

如何使用'use base'继承Perl中的子例程?

如何解决《如何使用'usebase'继承Perl中的子例程?》经验,为你挑选了4个好方法。

如何在Perl中应用'use base'来继承某些基本模块的subs?

我已经习惯了C++继承机制,而我为此搜索的所有网站都引起了更多的困惑然后帮助.我想做类似以下的事情:

#! /usr/bin/perl
#The base class to inherit from
use strict;
use warnings;

package 'TestBase';

#-------------------------------
sub tbSub
{
    my ($self, $parm) = @_;
    print "\nTestBase: $parm\n";
}

1;

.

#! /usr/bin/perl
#The descendent class
use strict;
use warnings;

use base qw(TestBase);
sub main;
sub mySub;

#-------------------------------
#Entry point...
main();

#---code------------------------
sub main
{
    mySub(1);
    tbSub(2);
    mySub(3);
}

#-------------------------------
sub mySub
{
    my $parm = shift;
    print "\nTester: $parm\n";
}

Perl抱怨/无法找到tbSub.



1> innaM..:

C++机制与Perl机制没什么不同:要使用继承,您需要两个类:基类和继承类.但是你没有任何后代课.

你也缺少一个构造函数.与C++不同,Perl不会为您提供默认构造函数.

您的基类包含错误的语法错误,所以我猜您在发布之前没有尝试过该代码.

最后,正如tsee已经观察到的那样,你必须让Perl知道你是想要一个函数调用还是一个方法调用.

你真正想要的是这样的:

my $foo = TestDescendent->new();
$foo->main();


package TestBase;

sub new {
   my $class = shift;
   return bless {}, $class;
}

sub tbSub
{
   my ($self, $parm) = @_;
   print "\nTestBase: $parm\n";
}

package TestDescendent;
use base 'TestBase';

sub main {
    my $self = shift;
    $self->mySub( 1 );
    $self->tbSub( 2 );
    $self->mySub( 3 );
}

sub mySub
{
    my $self = shift;
    my $parm = shift;
    print "\nTester: $parm\n";
}

1;



2> draegtun..:

您应该看一下使用Moose,它是Perl5的后现代对象系统.您可能会发现它比使用标准的Perl OO语义更容易掌握...特别是当来自另一种OO语言时.

这是你问题的穆斯版本....

package TestBase;
use Moose;

sub tbSub {
   my ($self, $parm) = @_;
   print "\nTestBase: $parm\n";
}


package TestDescendent;
use Moose;
extends 'TestBase';

sub main {
    my $self = shift;
    $self->mySub( 1 );
    $self->tbSub( 2 );
    $self->mySub( 3 );
}

sub mySub {
    my ($self, $parm) = @_;
    print "\nTester: $parm\n";
}


package main;
my $foo = TestDescendent->new();
$foo->main

差异是......

为您自动创建的构造函数

由"extends"命令而不是"use base"定义的继承.

所以这个例子只涵盖了Moose冰山的一角;-)



3> lexu..:

在我看来,你在这里混淆了两件事:面向对象和程序Perl.Perl OO有点"不同"(不是主流但可行).

您的TestBase.pm模块似乎希望作为Perl对象运行(Perl oo-style),但您的Perl脚本希望以"普通"模块的形式访问它.Perl不像C++那样工作(如你所知),所以你必须以不同的方式构造你的代码.请参阅Damian Conway的书籍以获得解释(以及比我下面更智能的代码).


程序:

#! /usr/bin/perl
#The module to inherit from

package TestBase;
  use strict;
  use warnings;

  use Exporter ();
  our @ISA         = qw (Exporter);
  our @EXPORT      = qw (tbSub);

#-------------------------------
sub tbSub
{
    my ($parm) = @_;
    print "\nTestBase: $parm\n";
}

1;

.

#! /usr/bin/perl
#The descendent class
use strict;
use warnings;

use TestBase; 
sub main;
sub mySub;

#-------------------------------
#Entry point...
main();

#---code------------------------
sub main
{

    mySub(1);
    tbSub(2);
    mySub(3);
}

#-------------------------------
sub mySub
{
    my $parm = shift;
    print "\nTester: $parm\n";
}

Perl OO

#! /usr/bin/perl
#The base class to inherit from

package TestBase;
  use strict;
  use warnings;

#-------------------------------
sub new { my $s={ };
    return bless $s;
}
sub tbSub
{
    my ($self,$parm) = @_;
    print "\nTestBase: $parm\n";
}

1;

.

#! /usr/bin/perl
#The descendent class
use strict;
use warnings;

use TestBase; 
sub main;
sub mySub;

#-------------------------------
#Entry point...
main();

#---code------------------------
sub main
{
    my $tb = TestBase->new();
    mySub(1);
    $tb->tbSub(2);
    mySub(3);
}

#-------------------------------
sub mySub
{
    my $parm = shift;
    print "\nTester: $parm\n";
}



4> Aristotle Pa..:

作为旁注,没有什么好的理由use base而不是新的.use parent

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有