1

問題:親オブジェクトの属性にアクセスできません

Verification.pm :(親クラス)

package Verification;
use Verification::Proid;

sub Proid
{
    my $self = shift;
    print Dumper($self);
    my $result = Verification::Proid->validate($self);

    return $result; 
}

ダンパー結果

$VAR1 = bless( {
    'event_name' => 'validate',
    'Verification_Type' => 'Proid',
    'Verification_Value' => 'ecmetric',
    'xml_request' => bless( do{\(my $o = 148410616)}, 'XML::LibXML::Document' ),
    'Verification_Options' => [
                                {
                                '2' => 'UNIX'
                                }
                              ],
    'Verification_ID' => '3'
    }, 'Verification' );

Proid.pm :(子クラス)

package Verification::Proid;
our @ISA = qw(Verification);

sub validate 
{
    my $self = shift;
    print Dumper($self);
    my $result;

    foreach my $validation_type ( @$self->{Verification_Options} )
    {
        do stuff...
    }
}

ダンパー結果

$VAR1 = 'Verification::Proid';

子クラスが渡されたオブジェクトからすべての属性を適切に取得していないというのは、何が間違っているのでしょうか。

ありがとうございました!

4

2 に答える 2

3
  1. 呼び出し構文が間違っています。ではなく、クラスVerification::Proid->validate($self)でメソッドを呼び出しています。$self

  2. 概念が間違っています。親クラスは、子クラスの物を名前で呼び出すべきではありません。それはクラスを持つという目的を完全に打ち負かします。

  3. オブジェクトは想定される子クラスに属していません。に祝福されているのVerificationではなく、に祝福されていVerification::Proidます。それが実際にインスタンスである場合は、親クラス内からでも、それをVerification::Proid呼び出すことができます。$self->validate

于 2012-08-31T16:22:30.300 に答える
0

@hobbs の欠陥を指摘してくれてありがとう、明らかに私は OO Perl についてもっと読む必要があります...もっとうまく扱えるようになるまで、Verification.pm で Class::Singleton を利用して機能的な回避策を見つけました

Verification.pm

package Verification;
use Verification::Proid;
use Class::Singleton;

#Instantiate the object as a singleton

sub Proid
{
    return Verification::Proid->validate();
}

Proid.pm

package Verification::Proid;
our @ISA = qw(Verification);

sub validate 
{
    my $self = Verification->instance;
    print Dumper($self);

    foreach my $validation_type ( @{$self->{Verification_Options}} )
    {
        do stuff...
    }
}

ダンパーの結果は私が必要としていたものです

$VAR1 = bless( {
    'event_name' => 'validate',
    'Verification_Type' => 'Proid',
    'Verification_Value' => 'ecmetric',
    'xml_request' => bless( do{\(my $o = 148410616)}, 'XML::LibXML::Document' ),
    'Verification_Options' => [
                                {
                                '2' => 'UNIX'
                                }
                              ],
    'Verification_ID' => '3'
    }, 'Verification' );
于 2012-08-31T21:36:03.870 に答える