-8

这是来自面向对象的 Perl 的一个问题。我应该设计一个模块:
1)存储值
2)计算总数,平均值,计数。
我应该在面向对象的 Perl 中找到与方法覆盖或多态性或继承相关的代码。

我的代码是这样的:

package Stats;
use strict;
use warnings;
sub new {
  my $class = @_;
  my $self = {};
  bless $self, $class;
  $self->clear();
  return $self;
}
sub clear {
  my $self = $_[0];
  $self->{'numlist'} = undef;
  $self->{'x_sum'} = 0;
  $self->{'x2_sum'} = 0;
}
sub addValue {
  my $self = $_[0];
  my $num = $_[1];
  if (defined $num) {
    push @{$self->{'numlist'}}, $num;
    $self->{'x_sum'} += $num;
    $self->{'x2_sum'} += $num**2;
  }
}
sub getTotal {
  my $self = $_[0];
  return $self->{'x_sum'};
}
sub getMean {
  my $self = $_[0];
  my @numlist = @{$self->{'numlist'}};
  if (!@numlist) { return 0; }
  return $self->getTotal()/@numlist;
}
sub getValueList {
  my $self = $_[0];
  return @{$self->{'numlist'}};
}
1;


sub results {
my $obj = new Stats(13,4,56,43,33);
print "Number of values: ", scalar($obj->getValueList()), "\n";
print "Total: ", $obj->getTotal(), "\n";
print "Mean: ", $obj->getMean(), "\n";
}

我哪里错了?

4

1 回答 1

1

好的。您使用的对象构造函数语法有点笨拙,我更喜欢

my $obj = Stats->new(13,4,56,43,33);

在 Perl 中,new不是一个普通的关键字,而是一个简单的 sub,应该这样使用。Foo->sub(@args)语法完全等同于,因此Foo::sub('Foo', @args)负责传递正确的类名并调用正确的new子类。

然后,您应该使用传递给Stats构造函数的数字。这个构造函数应该可以解决问题:

sub new {
  my ($class, @args) = @_;
  my $self = {};
  bless $self, $class;
  $self->clear();
  $self->addValue($_) foreach @args;
  return $self;
}

我将构造函数的所有参数填充到@args数组中,然后循环它们并将这些值添加到我们的 stats 对象中。

另外,不要忘记实际调用results()来执行您的测试。它将打印:

Number of values: 5
Total: 149
Mean: 29.8
于 2012-10-01T06:22:20.637 回答