Perl - 无法通过 "Module::SUPER" 找到 object 方法

Perl - Can't locate object method via "Module::SUPER"

这是我第一次将 OOP 与 perl 结合使用。我正在重构工作中的 4k 行程序程序。看起来很简单,但我对继承和 SUPER 有疑问。

错误信息:

"Can't locate object method "New" via package "Module::SUPER" at Module.pm line 10"

我已经尝试过,使用 base,parent 并设置 @ISA,但它们都得到相同的错误。我确定我必须忽略一些东西。

(这不是我正在处理的程序的代码。只是产生相同错误的示例)

在此示例中,所有 .pm 和 .pl 文件都位于同一目录中。在我正在处理的程序中,主程序在 bin 中,模块将在 ../modules(相对于 bin)中。
我想这就是我需要做的一切:

use lib "../modules";

如果我的想法有误,请告诉我。

Parent 模块

package BaseModule;
use strict;
use warnings;
sub new {
    my $class = shift;
    my $self  = {
        ARRAY => shift,
        DIVIDER => ","
    };
    bless ($self, $class);
    return $self;
}
sub array {
    my $self = shift;
    if(@_) { $self->{ARRAY} = shift };
    return $self->{ARRAY};  
}
sub divider {
    my $self = shift;
    if(@_) { $self->{DIVIDER} = shift };
    return $self->{DIVIDER};    
}
sub testSub {
    my $self = shift;   
    print join($self->{DIVIDER}, @{ $self->{ARRAY} } );
    return 1;
}

1;

Child 模块

package Module;
use strict;
use warnings;
#use base qw(BaseModule);
#require BaseModule;
#our @ISA = qw(BaseModule);
use parent qw(BaseModule);
sub new {
    my $class = shift;
    my $self  = $class->SUPER::New(@_);
    $self->{STRING} = shift;
    bless ($self, $class);
    return $self;
}
sub string {
    my $self = shift;
    if(@_) { $self->{STRING} = shift };
    return $self->{STRING}; 
}
sub testSub {
    my $self = shift;
    print "$self->{STRING}:\n";
    $self->SUPER::testSub();
    return 1;
}    
1;

如果 parent class returns 已经祝福了 $self,我还需要祝福 child class 吗?

主脚本

#!/usr/bin/perl
use strict;
use warnings;
use Module;

my $module = Module->new([1, 2, 3, 4, 5], "Example");
$module->divider(" | "); # Test Changing divider;
$module->testSub();

非常感谢任何帮助。

"Can't locate object method "New" via package "Module::SUPER" at Module.pm line 10"

您尝试调用 BaseModule::New 尚未定义(您是说 BaseModule::new 吗?Perl 区分大小写)。

Do I need to bless the child class if the parent class returns an already blessed $self?

不,$self 到那个时候已经是祝福了(你可以通过 Scalar::Util::blessed().

来检查