9

我有一个名为 RuleObject 的基础对象和一个继承自 RuleObjectString 的对象。我在 RuleObjectString 中有一个新方法,我想在使用该对象的代码中调用它。但我得到了错误。“无法通过 ./testobject.pl 第 10 行的包“RuleObject”找到对象方法“比较”。但我没有创建 RuleObject。我正在创建一个 RuleObjectString。我在这里做错了什么?

测试对象.pl

  1 #! /usr/bin/perl
  2
  3 use strict;
  4
  5 use RuleObjectString;
  6
  7 my $s = RuleObjectString->new();
  8 $s->value('stuff goes here');
  9
 10 if ($s->compare('stuff')){
 11         print "MATCH!\n";
 12 }else{
 13         print "no match :(\n";
 14 }

规则对象.pm

package RuleObject;

our @ISA = qw/Exporter/;
our @EXPORT = qw/new/;

use strict;

sub new{
        my $class = shift;

        my $self;
        $self->{value} = undef;

        bless $self;
        return $self;
}

sub value{
        my $self = shift;
        my $value = shift;
        if ($value){
                $self->{value} = $value;
        }else{
                return $self->{value};
        }
}

规则对象字符串.pm

package RuleObjectString;

our @ISA = qw/RuleObject/;
our @EXPORT = qw/compare/;

use strict;

sub compare{
        my $self = shift;
        my $compareto = shift;

        return $self->value() =~ /$compareto/;
}
4

3 回答 3

12

我认为 jmcneirney 是在正确的轨道上。在你的RuleObject构造函数中,你说

bless $self;

这与

bless $self, __PACKAGE__;

或者

bless $self, 'RuleObject'

但是你想要的是对象被祝福为RuleObjectString. 所以你想做的是说

bless $self, $class

现在

RuleObject->new()
RuleObjectString->new()

都将调用相同的构造函数,但第一次调用返回的对象将被祝福为 aRuleObject而第二个对象将被祝福为 a RuleObjectString

于 2012-11-16T18:37:11.897 回答
4

这是 2012 年,因此您应该考虑使用适当的 OOP 解决方案,而不是重新发明轮子。

通过使用Moose,解决方案看起来像这样(未经测试):

规则对象.pm

package RuleObject;
use Moose;

has 'value' => ( isa => 'Str', is => 'rw', required => 0, default => '' );

1;

规则对象字符串.pm

package RuleObjectString;
use Moose;

extends 'RuleObject';

sub compare {
    my $self      = shift;
    my $compareto = shift;

    return $self->value =~ /$compareto/;
}

1;

简单的!:)

于 2012-11-17T11:50:28.370 回答
0

尝试转储对象,看看它是什么。

print Dumper( $s )

这将是一个 RuleObject。

您可能需要在 RuleObjectString 中定义一个 new() 并让它调用 Super::new()。

于 2012-11-16T18:30:53.513 回答