向/从另一个类传递/访问对象属性

时间:2012-08-31 16:17:11

标签: perl

问题:无法访问父对象属性

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';

如果子类没有正确地从传递给它的对象获取所有属性,我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

  1. 您的调用语法错误。 Verification::Proid->validate($self)正在上调用方法,而不是$self上的方法。

  2. 概念是错误的。父类不应该按名称调用子类中的内容;它完全违背了上课的目的。

  3. 您的对象属于属于所谓的子类;它被祝福Verification,而不是Verification::Proid。如果它实际上是Verification::Proid的实例,您可以在其上调用$self->validate,即使是在父类中也是如此。

答案 1 :(得分:0)

感谢指出@hobbs的缺陷,很明显我需要阅读更多有关OO Perl的内容......在我得到更好的处理之前,我通过在Verification中使用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' );