0

次のメソッドを持つクラスを持っているとしましょう (これは少しばかげていますが、実際にはデフォルトのディレクトリと関係があります):

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

ユーザーがこれらのメソッドのいずれかまたは両方をオーバーライドできるようにしたい、またはまったくオーバーライドできないようにしたいと考えています。メソッドの 1 つをオーバーライドする場合、もちろん他のメソッドはデフォルトを使用するため、 を に設定getOneする7と. ユーザーは両方をオーバーライドすることもできます。しかし、ユーザーは何も上書きすることもできません。その場合、結果は明らかな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

ここで自分の質問に答えて、オプションのパラメーターでループを壊すことでこれを解決しました。

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 に答える