我有一个名为RuleObject的基础对象和一个从名为RuleObjectString的继承对象。我在RuleObjectString中有一个新方法,我想在我使用该对象的代码中调用它。但是我得到了错误。 '找不到对象方法“比较”通过包“RuleObject”在./testobject.pl第10行。'但我不是在创建一个RuleObject。我正在创建一个RuleObjectString。我在这里做错了什么?
testobject.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 }
RuleObject.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};
}
}
RuleObjectString.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/;
}
答案 0 :(得分:12)
我认为jmcneirney走在正确的轨道上。在RuleObject
构造函数中,您说
bless $self;
与
相同bless $self, __PACKAGE__;
或
bless $self, 'RuleObject'
但你想要的是让对象成为RuleObjectString
祝福。所以你要做的就是说
bless $self, $class
现在
RuleObject->new()
RuleObjectString->new()
将同时调用相同的构造函数,但第一个调用返回的对象将被祝福为RuleObject
,第二个对象将被祝福为RuleObjectString
。
答案 1 :(得分:5)
这是2012年,所以你应该考虑使用适当的OOP解决方案,而不是重新重新发明轮子。
使用Moose,解决方案看起来像这样(未经测试):
RuleObject.pm
package RuleObject;
use Moose;
has 'value' => ( isa => 'Str', is => 'rw', required => 0, default => '' );
1;
RuleObjectString.pm
package RuleObjectString;
use Moose;
extends 'RuleObject';
sub compare {
my $self = shift;
my $compareto = shift;
return $self->value =~ /$compareto/;
}
1;
简单! :)
答案 2 :(得分:0)
尝试转储对象并查看它是什么。
print Dumper( $s )
它将成为一个RuleObject。
您可能需要在RuleObjectString中定义new() 并让它调用Super :: new()。