如何使类的成员成为perl中的对象

Pei*_* Li 1 oop perl

您好基本上是perl中的OO编程问题.我希望有两个对象A和B,A包含一个类型为B的成员变量.我做了一些测试,但似乎不起作用.任何的想法?

a.pm

package a;


sub new{
    my $self = {};
    my $b = shift;
    $self->{B} = $b;
    bless $self;
    return $self;
}

sub doa{
    my $self = shift;
    print "a\n";
    $self->{B}->dob;
}

1;
Run Code Online (Sandbox Code Playgroud)

b.pm

package b;

sub new {
    my $self = {};
    bless $self;
    return $self;
}

sub dob{
    my $self = shift;
    print "b\n";
} 



1;
Run Code Online (Sandbox Code Playgroud)

test.pl

use a;
use b;

my $b = b->new;
my $a = a->new($b);
$a->doa;
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它显示:

a
Can't locate object method "dob" via package "a" at a.pm line 16.
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 6

你忘记了方法的第一个参数.方法的第一个参数始终是调用者.

sub new {
    my ($class, $b) = @_;
    my $self = {};
    $self->{B} = $b;
    return bless($self, $class);
}
Run Code Online (Sandbox Code Playgroud)

不过,我通常是bless第一个

sub new {
    my ($class, ...) = @_;
    my $self = bless({}, $class);
    $self->{attribute} = ...;
    return $self;
}
Run Code Online (Sandbox Code Playgroud)

因为它与派生类的构造函数更一致.

sub new {
    my ($class, ...) = @_;
    my $self = $class->SUPER::new(...);
    $self->{attribute} = ...;
    return $self;
}
Run Code Online (Sandbox Code Playgroud)