2016-04-16 5 views
4

Someパッケージを拡張し、funcメソッドを再定義するこのコード例-2のパッケージを作成してください。コードをrunnig"override"を使うか、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; 
} 

を与える:

func from Some 
func from Over 
func from Plain 

例えばfuncメソッドは、両方の場合に、警告などを伴わずに再定義されます。

質問:

  • は、ここでは二つの方法の間にいくつかの意味の違いがありますか?
  • overrideを使用し、の場合はを再定義する必要がありますか?
  • これはいくつかの文書で説明されていますか?
+0

再定義されるメソッドはありません。 'Some :: func'、' Over :: func'、 'Plain :: func'という3つの異なるメソッドを定義しています。 – mob

+0

@ mob hm ..そして、正しい用語は何ですか? 'Over'は再定義ではなく' override'ですが、_redefine_が正しくない場合に 'Plain'シナリオを呼び出す方法を前提としていますか? – cajwine

答えて

4

documentationがこれを完全に回答します。

override ($name, &sub)

オーバーライドメソッドは、明示的に「私はスーパークラスからこのメソッドをオーバーライドしています」というのが方法です。このメソッド内でsuperと呼び出すことができ、期待どおりに動作します。同じことが通常のメソッド呼び出しとSUPER::擬似パッケージで実現できます。それは本当にあなたの選択です。

+0

違いがあります。一つは「スーパー」を提供する。もう片方はしません。 – ikegami

+0

また、オーバーライドしているメソッドを基本クラスが定義していない場合、オーバーライドすると例外がスローされます。 –

関連する問題