具有默认值的相互递归方法

时间:2013-02-14 04:47:33

标签: perl oop

让我说我有一个使用以下方法的类(这有点傻,我知道,实际上它与默认目录有关):

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

我想允许用户覆盖这些方法中的一个,两个或两个。在覆盖其中一个方法的情况下,另一个当然采用默认方法,因此将getOne设置为7会导致getZero6。用户也可以覆盖两者。但是用户也可以根本不覆盖任何一个,在这种情况下,结果应该是显而易见的10。在上述代码失败的情况下,在这种情况下它会进入无限循环。

我知道我可以:

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); 
}

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

没有单独的“覆盖”方法可以实现上述任何方法吗?

1 个答案:

答案 0 :(得分:1)

在这里回答我自己的问题,我刚刚通过用可选参数打破循环来解决这个问题,即

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

sub getZero 
{
  my ($self, $default_call) = @_;
  return $default_call ? 0 : $self->getOne() - 1;  
}