如何应用Perl中的“use”从某个基本模块继承子模块?
我已经习惯了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。
发布于 2008-11-03 10:50:45
C++机制与Perl机制没有太大不同:要使用继承,需要两个类:基类和继承类。但你没有后代阶级。
您还缺少构造函数。与C++不同,Perl不会为您提供默认构造函数。
您的基类包含一个错误的语法错误,所以我想您在发布之前没有尝试过这些代码。
最后,正如已经观察到的,您必须让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;
发布于 2008-11-03 17:10:48
您应该看看如何使用驼鹿,这是一个用于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
区别是..。
所以这个例子只涵盖了驼鹿冰山的一角;-)
发布于 2008-11-03 10:55:57
在我看来,这里混淆了两件事:面向对象的Perl和过程Perl。Perl是一种“不同的”(不是主流,而是可行的)。
您的TestBase.pm模块似乎期望以Perl对象(Perl oo样式)的形式运行,但是您的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";
}
https://stackoverflow.com/questions/258251
复制相似问题