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

Perl 具有默认值的相互递归方法,perl,oop,Perl,Oop,假设我有一个具有以下方法的类(我知道这有点傻,实际上它更多地与默认目录有关): 我希望允许用户覆盖其中一个、两个或任何一个方法。在重写其中一个方法的情况下,另一个方法当然采用默认值,因此将getOne设置为7将导致getZero为6。用户也可以同时覆盖这两个选项。但是用户也可以完全不覆盖任何内容,在这种情况下,结果应该是明显的1和0。这是上述代码失败的情况,在这种情况下,它进入无限循环 我知道我可以: sub getOneOverride { undef; } sub getZeroOverri

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

我希望允许用户覆盖其中一个、两个或任何一个方法。在重写其中一个方法的情况下,另一个方法当然采用默认值,因此将
getOne
设置为
7
将导致
getZero
6
。用户也可以同时覆盖这两个选项。但是用户也可以完全不覆盖任何内容,在这种情况下,结果应该是明显的
1
0
。这是上述代码失败的情况,在这种情况下,它进入无限循环

我知道我可以:

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); 
}
但这需要单独的重写和读取方法,我觉得这有点混乱


在没有单独的“覆盖”方法的情况下,有没有办法实现上述目标?

在这里回答我自己的问题,我刚刚通过使用一个可选参数(即

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

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

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