0

假设我有一个具有以下方法的类(这有点傻,我知道,实际上它更多地与默认目录有关):

sub getOne { my $self = shift; return $self->getZero() + 1; }
sub getZero { my $self = shift; return $self->getOne() - 1; }

我想允许用户覆盖这些方法中的一个、两个或一个都不覆盖。在覆盖其中一种方法的情况下,另一种当然采用默认值,因此设置getOne为将7导致. 用户也可以覆盖两者。但用户也可以完全覆盖 none,在这种情况下,结果应该是显而易见的and 。这是上面代码失败的情况,在这种情况下它进入了一个无限循环。getZero610

我知道我可以:

sub getOneOverride { undef; }
sub getZeroOverride { undef; }

sub getOne  
{ 
  my $self = shift; 
  return $self->getOneOverride() or 
    ($self->getZeroOverride() ? $self->getZeroOverride() + 1 : 1); 
}

sub getZero 
{
  my $self = shift; 
  return $self->getZeroOverride() or 
    ($self->getOneOverride() ? $self->getOneOverride() - 1 : 0); 
}

但这需要单独的覆盖和读取方法,我觉得这有点混乱。

有什么方法可以在没有单独的“覆盖”方法的情况下实现上述目标?

4

1 回答 1

1

Answering my own question here, I've just solved this by breaking the loop with an optional parameter, i.e.

sub getOne  { my $self = shift; return $self->getZero(1) + 1; }

sub getZero 
{
  my ($self, $default_call) = @_;
  return $default_call ? 0 : $self->getOne() - 1;  
}
于 2013-02-14T05:02:16.077 回答