2016-04-16 3 views
4

neu definieren Haben Sie diesen Beispielcode - 2 Pakete, die das Some Paket erweitert und die func Methode neu definiert.Mit "override" oder einfach nur die Unterroutine in Perl

use 5.014; 
use warnings; 

package Some { 
    use Moose; 
    use warnings; 
    sub func { say 'func from Some'; } 
} 

package Over { 
    use Moose; 
    use warnings; 
    extends 'Some'; 
    override 'func' => sub { say 'func from Over'; }; 
} 

package Plain { 
    use Moose; 
    use warnings; 
    extends 'Some'; 
    sub func { say 'func from Plain'; }; 
} 

#main 
for my $package (qw(Some Over Plain)) { 
    my $instance = $package->new(); 
    $instance->func; 
} 

den Code Tagrunnig gibt:

func from Some 
func from Over 
func from Plain 

z.B. Die Methode func wird in beiden Fällen ohne Warnung oder dergleichen neu definiert.

Die Fragen:

  • sind hier einige bedeutsame Unterschiede zwischen den beiden Möglichkeiten?
  • wenn ich die override verwenden sollte und wenn die plain neu definieren?
  • wird dies in einigen doc diskutiert?
+0

Keine Methoden werden neu definiert. Sie definieren drei verschiedene Methoden 'Some :: func',' Over :: func' und 'Plain :: func'. – mob

+0

@mob hm .. und was die richtige Terminologie? Angenommen, dass für das "Over" ist "Override" anstelle der Neudefinieren, aber wie das 'Plain' Szenario zu nennen, wenn das _redefine_ nicht korrekt ist? – cajwine

Antwort

4

Die documentation antwortet perfekt.

override ($name, &sub)

Eine Überschreibung Methode ist eine Möglichkeit, explizit zu sagen „Ich habe diese Methode von meiner übergeordneten Klasse bin überwiegende“. Sie können innerhalb dieser Methode super aufrufen, und es wird wie erwartet funktionieren. Dasselbe kann mit einem normalen Methodenaufruf und dem Pseudo-Paket SUPER:: erreicht werden; es ist wirklich deine Entscheidung.

+0

Es gibt einen Unterschied erwähnt. Man bietet "Super"; der andere nicht. – ikegami

+0

Außerdem überschreibt override eine Ausnahme, wenn die Basisklasse die überschreibende Methode nicht definiert. –

Verwandte Themen