3

私は以下を持っています。

package A;

sub new {
  my ($class) = @_;
  my $self = { };
  bless $self, $class;
  return($self);
}

sub run() {
  die "Task: ",__PACKAGE__,  "requires a run method";
}

package B;
use A;
our @ISA = qw(A);
sub new {
  my ($class) = @_;
  my $self = { };
  bless $self, $class;
  return($self);
}

package C;
use A;
my @Tasks;

sub new {
  my ($class) = @_;
  my $self = { };
  bless $self, $class;
  return($self);
}

sub add{
   my($self,$tempTask) = @_ ;
   push(@Tasks,$tempTask);
   $arraysize = @Tasks;
}

sub execute{
    foreach my $obj (@Tasks)
    {
            $obj->run();
    }
}
1;

脚本

#!/usr/local/bin/perl
use strict;
use C;
use B;

my $tb = new C();
my $task = new B();
$tb->add($task);
$tb->execute();

パッケージBにはrunメソッドがないため、デフォルトでパッケージAのrunメソッドが必要です。この時点で、パッケージBの名前を出力したいと思います(パッケージAを継承するさまざまなパッケージがありますが、そうではありません。

現在、__PACKAGE__変数を使用してパッケージAを出力します。

何か助けはありますか?

4

3 に答える 3

10

オブジェクトは祝福された参照です。__PACKAGE__常に現在のパッケージの名前と同じになります。ただしref( $object )、オブジェクトのクラスの名前が表示されます。Scalar::Util::blessed祝福されていない参照に対して誤検知を発生させない、もあります。

use Scalar::Util qw<blessed>;

my $obj   = bless {}, 'A';
my $class = ref( {} );       # HASH
$class    = blessed( {} );   # ''
$class    = ref( $obj );     # A
$class    = blessed( $obj ); # A

したがって、特定の場合:

sub run() {
    die "Task: " . ref( shift ) . "requires a run method";
}
于 2012-11-02T15:38:58.890 に答える
2

コードをこれに置き換えA::runます...

die "Task: ", ref shift,  " requires a run method";

...呼び出し元オブジェクトが属するパッケージ(クラス)の名前を示します(オブジェクトで呼び出される各メソッドの最初の引数はそのオブジェクト自体であり、refそのクラス名を文字列として返します)

于 2012-11-02T15:41:50.910 に答える
0

caller()は、パッケージ名を含め、必要なスタックフレームを提供できるため、これに対する一般的な答えです。

于 2012-11-02T15:51:00.560 に答える