在Perl类中声明多个对象

时间:2017-05-08 23:45:34

标签: perl oop self

我遇到了问题,那就是我想使用$ self变量初始化两个对象。第一个对象将被初始化,但第二个对象将不会被初始化。这是一些代码:

     ###Class main
     use bar;
     use arg; 
     sub new{
          my $class = shift;
          my $args = shift;

          my $self = {};
          $self->{'foo'} = $class->SUPER->new($args);
          $self->{'bar'} = bar->new();
          bless($self, $class);
          return $self;
     }

   sub getFoo{
        my $self = shift;
        return $self->{'foo'};
   }

    sub getBar{
         my $self = shift;
        return $self->{'bar'};

    }

对于函数getFoo,它返回一个值但是对于getBar,返回的值是undef,为什么会发生这种情况?感谢

EDIT1 是的,arg是类的父级,foo是一个我想使用某些方法的类。

    ####class bar
    package bar;
    sub new{
      my $class = shift;
      my $self = {
          _bar1 => shift // 0,
          _bar2 => shift //0,
       };
      bless($self,$class);
      return $self;
    }

     sub getBar1{
        my $self = shift;
        return $self->{_bar1};
     }

但是,如果我现在在班级主要

中这样做
    $self->{__bar}->getBar1;

返回的消息是:无法在未定义的值上调用方法“getBar1”。

1 个答案:

答案 0 :(得分:4)

将对象放在

$self->{bar}

然后你打电话

$self->{__bar}->getBar1

将其更改为

$self->{bar}->getBar1

您似乎还有其他一些问题。根据您对代码的描述,Unnamed.pm应包含以下内容:(不要使用main;已经使用过了。)

package Unnamed;

use strict;
use warnings qw( all );

use foo qw( );
use bar qw( );

use parent 'arg';

sub new {
    my $class = shift;
    my $args = shift;
    my $self = $class->SUPER::new($args);
    $self->{foo} = foo->new();
    $self->{bar} = bar->new();
    return $self;
}

sub get_foo {
    my $self = shift;
    return $self->{foo};
}

sub get_bar {
    my $self = shift;
    return $self->{bar};
}

1;

然后,你可以做

my $o = Unnamed->new();
$o->get_bar->bar_method();