Почему Вызов super Perl не использует метод стрелки?

если Вы используете PHP 7 & 7 +, можно использовать выборку как это также

define('TEAM', ['guy', 'development team']);
echo TEAM[0]; 
// output from system will be "guy"
13
задан Adam Bellaire 6 September 2009 в 14:12
поделиться

4 ответа

Я подозреваю, потому что $ class-> SUPER-> new () обычно будет таким же, как ] $ class-> SUPER () -> new () . Но нет функции $ class-> SUPER () , и неясно, что это вернет.

С другой стороны, $ class-> Foo :: Bar всегда был допустимым способом вызова метода напрямую по полному имени, поэтому для этого нужно было создать специальный в упаковке - SUPER - лучше подходит. (Я подозреваю, что вы могли бы реализовать SUPER как пакет, и, возможно, исторически так и было, я не знаю)

PS: Взгляните на пакет mro , и $ self-> next :: method . Также обратите внимание на Moose, если вы собираетесь серьезно заняться объектно-ориентированной работой на Perl.

(Я подозреваю, что вы действительно могли бы реализовать SUPER как пакет, и, возможно, это было исторически, я не знаю)

PS: Взгляните на пакет mro , и $ self-> next :: method . Также обратите внимание на Moose, если вы собираетесь серьезно заняться объектно-ориентированной работой на Perl.

(Я подозреваю, что вы действительно могли бы реализовать SUPER как пакет, и, возможно, это было исторически, я не знаю)

PS: Взгляните на пакет mro , и $ self-> next :: method . Также обратите внимание на Moose, если вы собираетесь серьезно заняться объектно-ориентированной работой на Perl.

14
ответ дан 1 December 2019 в 17:48
поделиться

Короче говоря, SUPER - это не метод. Это виртуальный пакет. Это задокументировано в perlobj в разделе «Вызов метода».

Обратите внимание, однако, что SUPER основывается на текущем пакете, а не на пакете экземпляра, с которым вы его использовали.

13
ответ дан 1 December 2019 в 17:48
поделиться

Вызов методов имеет несколько форм:

Вызывает метод, возможно, унаследованный:

->method()

Явно вызывает подпакет :: метод, независимо от того, находится он в дереве наследования или нет:

->Package::method()

Явно вызывает упомянутый подпрограмм, независимо от того, находится он в дереве наследования или нет:

->$coderef()

Вызывает метод, который был бы вызван __ PACKAGE __-> method () , если бы в не было подметода ] __ PACKAGE __ (NB класс или объект слева от -> не имеет значения):

->SUPER::method()

Любое из вышеперечисленных, в зависимости от содержимого $ method :

->$method()

(Юридически даже при используйте строгий; .)

Хотя первая форма является наиболее распространенной, стоит узнать о других и о том, как они работают.

13
ответ дан 1 December 2019 в 17:48
поделиться

В дополнение к сказанному Деробертом:

Вы называете «новым» в пространстве имен 'SUPER', но передавая ему объект (или строку), '$ class'.

У вас нет для использования SUPER, так как вы можете указать полное имя пакета родительского (полезно в случаях алмазного наследования):

sub init {
   my $self = shift;
   $self->ParentClass1::init();
   $self->ParentClass2::init();
}
7
ответ дан 1 December 2019 в 17:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: