如何在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;
Run Code Online (Sandbox Code Playgroud)
.
#! /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";
}
Run Code Online (Sandbox Code Playgroud)
Perl抱怨/无法找到tbSub.
inn*_*naM 23
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;
Run Code Online (Sandbox Code Playgroud)
dra*_*tun 10
您应该看一下使用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
Run Code Online (Sandbox Code Playgroud)
差异是......
所以这个例子只涵盖了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;
Run Code Online (Sandbox Code Playgroud)
.
#! /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";
}
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
.
#! /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";
}
Run Code Online (Sandbox Code Playgroud)