代码之家  ›  专栏  ›  技术社区  ›  Jonathan

在Perl中,如何在基类和子类之间共享变量?

  •  2
  • Jonathan  · 技术社区  · 14 年前

    我有一个这样的基类:

    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 就像我想要原始的 类名 ,并且仍然可以从中访问所有变量和函数 Exporter . 但是我在获取 出口商 原始类中的变量, 类名 ,以便正确导出。我需要跑步吗 出口商 再次进入子类?这似乎是多余和不清楚的。

    示例文件:

    #!/usr/bin/perl
    
    use MySubclass qw/$ME/;
    
    -- rest of code
    

    但是当我尝试导入 $ME 变量。有什么建议吗?

    4 回复  |  直到 10 年前
        1
  •  3
  •   Ether    14 年前

    你实际上没有继承 MySubclass MyClass 一点也不-- MySubClass 的用户 类名 . 你所做的是从 类名 ,但只有当您将其视为继承时,您才会混淆自己,因为它不是继承(例如:构造函数在哪里?)直到我忽略了所有的代码,我才知道你想做什么。 读一下你对你想要发生的事情的描述。

    好吧,你有一个类,它导入一些符号,一些函数和变量:

    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 (the documentation 说它已经过时了,所以如果你仍然想在不了解其机制的情况下使用它,那就太危险了)。

        2
  •  8
  •   brian d foy    14 年前

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

    出现语法错误是因为出现了语法错误:

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

    您需要一个列表:

     use MySubclass qw/$ME/;
    

    但是,不要这样做。通过方法提供对这些数据的访问。因为您将继承这些方法,所以不需要(也不应该使用)导出器:

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

    现在您的子类只是:

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

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

        3
  •  4
  •   Dave Sherohman    14 年前

    通常,OOPerl和Exporter是分开的,而不是混合在一起。这就是其中一个原因。

    就像布莱恩说的那样,如果你把所有要出口的垃圾都拿出来,把它们变成类属性/方法,然后完全摆脱出口商,你将有一个更容易的时间让它在第一时间开始工作,并在将来进一步扩展它。简单的事实是,你想做的方式,需要你进口和再出口一切应该是一个大的,闪烁的线索,有可能是一个更好的方式做它(即,一种不涉及出口商的方式)。

        4
  •  0
  •   Yordan Georgiev    10 年前
            # 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
    
    推荐文章