2

我有一个这样的基类:

package MyClass;

use vars qw/$ME list of vars/;
use Exporter;
@ISA = qw/Exporter/;
@EXPORT_OK = qw/ many variables & functions/;
%EXPORT_TAGS = (all => \@EXPORT_OK );

sub my_method {

}
sub other_methods etc {

}

--- more code---

我想子类化MyClass,但只针对一种方法。

package MySubclass;

use MyClass;
use vars qw/@ISA/;
@ISA = 'MyClass';

sub my_method {

--- new method

}

我想像MySubclass原来的那样调用它MyClass,并且仍然可以访问所有的变量和函数Exporter。但是,我在Exporter从原始类中获取变量MyClass以正确导出时遇到问题。我需要Exporter在子类中再次运行吗?这似乎是多余和不清楚的。

示例文件:

#!/usr/bin/perl

use MySubclass qw/$ME/;

-- rest of code

但是当我尝试导入$ME变量时出现编译错误。有什么建议么?

4

4 回答 4

8

您应该通过方法访问所有内容。忘记传递变量。

您收到语法错误,因为您有语法错误:

 use MySubclass /$ME/; # syntax error - that's the match operator

你想要一个列表:

 use MySubclass qw/$ME/;

但是,不要那样做。通过方法提供对这些数据的访问。由于您将继承这些方法,因此您不需要(也不应该使用)Exporter:

 package MyClass;

 BEGIN {
 my $ME;
 sub get_me { $ME }
 sub set_me { $ME = shift }
 }

现在你的子类只是:

 package MySubclass;
 use parent( MyClass );
 sub my_method { ... }

如果您需要共享许多变量,则有各种模块可以自动为您处理访问者详细信息。

于 2010-04-20T01:06:02.403 回答
4

一般来说,OO Perl 和 Exporter 通常是分开的,而不是混合在一起。这也是原因之一。

就像布赖恩说的那样,如果你把所有你要导出的废话,把它变成类属性/方法,然后摆脱,你会更容易让它首先工作,并在未来进一步扩展它出口商完全。您想要执行此操作的方式要求您导入和重新导出所有内容这一简单事实应该是一个重要的、闪烁的线索,表明可能有更好的方式来执行此操作(即,一种不涉及 Exporter 的方式)。

于 2010-04-20T09:31:51.140 回答
3

您实际上根本没有继承MySubclassMyClass——MySubClass. MyClass您正在做的是覆盖来自 的一些行为MyClass,但是如果您将其视为继承,您只会感到困惑,因为它不是(例如:您的构造函数在哪里?)我无法弄清楚您是什么一直在尝试做,直到我忽略了代码所做的所有事情,而只是阅读了您对您想要发生的事情的描述。

好的,所以你有一个导入一些符号的类 - 一些函数和一些变量:

package MyClass;
use strict;
use warnings;

use Exporter 'import';    # gives you Exporter's import() method directly
our @EXPORT_OK = qw/ many variables & functions/;
our %EXPORT_TAGS = (all => \@EXPORT_OK );
our ($ME, $list, $of, $vars);

sub my_func {

}
sub other_func {

}
1;

然后你来写一个类,它从 MyClass 导入所有内容,再次将它们全部导入,但将一个函数换成另一个函数:

package MyBetterclass;
use strict;
use warnings;
use Exporter 'import';    # gives you Exporter's import() method directly
our @EXPORT_OK = qw/ many variables & functions /;
our %EXPORT_TAGS = (all => \@EXPORT_OK );
use MyClass ':all';

sub my_func {
    # new definition   
}
1;

就是这样!请注意,我启用了严格检查和警告,并更改了实际上是函数的“方法”的名称。此外,我没有使用use vars文档说它已经过时,所以如果您仍然想在不了解其机制的情况下使用它,这是一个很大的危险信号)。

于 2010-04-20T02:56:22.967 回答
0
        # use setters and getters the Perl's way 
        #
        # ---------------------------------------
        # return a field's value
        # ---------------------------------------
        sub get {

            my $self = shift;
            my $name = shift;
            return $self->{ $name };
        }    #eof sub get


        #
        # ---------------------------------------
        # set a field's value
        # ---------------------------------------
        sub set {

            my $self  = shift;
            my $name  = shift;
            my $value = shift;
            $self->{ $name } = $value;
        }
        #eof sub set


        #
        # ---------------------------------------
        # return the fields of this obj instance
        # ---------------------------------------
        sub dumpFields {
            my $self = shift;

            my $strFields = ();
            foreach my $key ( keys %$self ) {
                $strFields .= "$key = $self->{$key}\n";
            }

            return $strFields;
        }    #eof sub dumpFields
于 2014-08-25T10:14:21.090 回答