Обнаружение переопределенных методов в Perl

Пакет Ada - это в основном просто пространство имен, поэтому он не влияет на исполняемый код, генерируемый компилятором.

Позвольте мне попытаться проиллюстрировать это.

Ада:

   ...
   A := B;
   ...

может излучать такой код, как:

...
CPY B, A
...

Ада:

   package P is
      B: Integer;
      ...
   end;
   ...
   A := P.B;
   ...

может излучать точно такой же код. Тот факт, что B теперь находится внутри пакета, не меняет выданный код.

Пакет может иметь код инициализации, который будет реализован очень похоже на процедуру. Создание экземпляра универсального пакета может быть реализовано как запись (компоненты которой содержат универсальные параметры) или может быть развернуто на месте, и в этом случае ситуация такая же, как и с неуниверсальным пакетом.

Интересный вопрос! Почему ты спрашиваешь?

9
задан Ovid 8 March 2009 в 14:37
поделиться

1 ответ

Один способ осуществить это:

package Base;
...
sub new {
    my $class = shift;
    ...
    check_overrides( $class );
    ...
}

sub check_overrides {
    my $class = shift;
    for my $method ( @unoverridable ) {
        die "horribly" if __PACKAGE__->can( $method ) != $class->can( $method );
    }
}

Memoization check_overrides может быть полезным.

Если существуют некоторые случаи, где Вы хотите льготы, имеете альтернативное имя метода и имеете вызов базового класса что:

package Base;
...
my @unoverridable = 'DESTROY';
sub destroy {}
sub DESTROY {
    my $self = shift;
    # do essential stuff
    ...
    $self->destroy();
}
6
ответ дан 4 December 2019 в 23:41
поделиться