Используя Mason2. Иметь 3 компонента.
/Base.mc
/tmp/Base.mc
/tmp/index.mc
/tmp/index.mc
с содержимым:
hello from <% $m->request_path %></br>
<% $.Some %>
$.Some
— это метод, определенный в /Base.mc
:
<%augment wrap><% inner() %></%augment>
<%method Some>
The default "Some" method defined in the <% __PACKAGE__ %>
</%method>
/tmp/Base.mc
содержит только
<%augment wrap><% inner() %></%augment>
Запрос /tmp/index
распечаток:
hello from /tmp/index
The default "Some" method defined in the MC0::Base_mc
Теперь добавил метод Some
в /tmp/Base.mc
<%method Some>
Redefined "Some" method in <% __PACKAGE__ %>
</%method>
Снова запросив /tmp/index
, он печатает:
hello from /tmp/index
Redefined "Some" method in MC0::tmp_Base_mc
Он соблюдал переопределенный метод Some
в обернутом /tmp/Base.mc
Вопрос в том:
Если Мейсон позволяет переопределять методы, как указано выше, какова цель <%override method>
? Отличается ли <%override Some>
чем-то другим? (когда я тестировал, он печатает то же самое).
EDIT Возможно, вопрос можно свести к следующему коду perl.
use 5.014;
use warnings;
package My;
use Moose;
sub some { say "some from " . __PACKAGE__ }
package My2;
use Moose;
extends 'My';
sub some { say "another some from " . __PACKAGE__ }
#the above line is an correct way to refefine a sub "some"?
#so don;t need to use the
#override 'some' => sub { say "another some from " . __PACKAGE__ };
package main;
use My2;
my $m = My2->new();
$m->some();
в обоих случаях (например, «простое» переопределение и переопределение с «переопределением») печатает:
another some from My2
Таким образом, единственная разница заключается в возможности вызова super()
в some
с помощью override
? и извините, если я пропустил некоторые базовые знания... ;(