如何在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.
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;
您应该看一下使用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冰山的一角;-)
在我看来,你在这里混淆了两件事:面向对象和程序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"; }
作为旁注,没有什么好的理由use base
而不是新的.use parent