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が、メソッドは 1 つだけです。

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 は通常、混合せずに別々に保持されます。これが理由の1つです。

ブライアンが言ったように、エクスポートしているすべてのがらくたをクラスのプロパティ/メソッドに変換して取り除くと、これを最初に機能させ、将来さらに拡張することがはるかに簡単になります。完全にエクスポーターの。あなたがやりたい方法ではすべてをインポートして再エクスポートする必要があるという単純な事実は、それを行うためのより良い方法 (つまり、Exporter を使用しない方法) がおそらくあるという大きな、ひらめきの手がかりになるはずです。

于 2010-04-20T09:31:51.140 に答える
3

あなたは実際にはまったく継承MySubclassしていませんMyClass-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 に答える