首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何继承Perl中带有“use”的子程序?

如何继承Perl中带有“use”的子程序?
EN

Stack Overflow用户
提问于 2008-11-03 09:58:27
回答 6查看 19.8K关注 0票数 15

如何应用Perl中的“use”从某个基本模块继承子模块?

我已经习惯了C++的继承机制,我搜索的所有站点都造成了更多的混乱,而不是帮助。我想做以下几件事:

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

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-11-03 10:50:45

C++机制与Perl机制没有太大不同:要使用继承,需要两个类:基类和继承类。但你没有后代阶级。

您还缺少构造函数。与C++不同,Perl不会为您提供默认构造函数。

您的基类包含一个错误的语法错误,所以我想您在发布之前没有尝试过这些代码。

最后,正如已经观察到的,您必须让Perl知道您是想要函数调用还是方法调用。

你真正想要的东西会是这样的:

代码语言:javascript
运行
复制
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;
票数 23
EN

Stack Overflow用户

发布于 2008-11-03 17:10:48

您应该看看如何使用驼鹿,这是一个用于Perl5的后现代对象系统。您可能会发现它比使用标准Perl OO语义容易得多.尤其是来自另一种OO语言的时候。

这是你问题的驼鹿版本..。

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

区别是..。

  • 构造函数自动为您创建&
  • 继承由“扩展”命令定义,而不是“使用基”。

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

票数 10
EN

Stack Overflow用户

发布于 2008-11-03 10:55:57

在我看来,这里混淆了两件事:面向对象的Perl和过程Perl。Perl是一种“不同的”(不是主流,而是可行的)。

您的TestBase.pm模块似乎期望以Perl对象(Perl oo样式)的形式运行,但是您的Perl脚本希望以“普通”模块的形式访问它。Perl不像C++那样工作(正如您意识到的那样),因此您必须以不同的方式构造代码。请参阅Damian Conway的书以获得解释(下面的代码比我的更聪明)。

过程性:

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

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

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

代码语言:javascript
运行
复制
#! /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";
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/258251

复制
相关文章

相似问题

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