2017-08-14 15 views
2

私はPerlとMooseを使って抽象メソッドパターンを作成しようとしています。私が理解していないことは、AbstractClassからメソッドをオーバーライドすると、結局呼び出されることになります。なぜこれがあり、スーパークラスが呼び出されないようにする方法がありますか?Perl - オーバーライドされたメソッドを避けるsuper()が呼び出される

メイン

package main; 
use AbstractSort; 
use OrderedSort; 

# Sub class test 
my $ordered = OrderedSort->new(array => [1, -1, 23, 34123, -24324]); 
$ordered->sortData(); 

AbstractClass

package AbstractSort; 
use namespace::autoclean; # Trims EXPORTER 
use Moose; 

has 'array' => (traits => ['Array'], 
      is => 'ro', 
      isa => 'ArrayRef[Int]', 
      default => sub { [] }, 
      handles => {  
       get_array => 'get', 
       count_array => 'count', 
      }); 

sub sortData{ 
    my $self = shift; 

    print "Sorting data..\n"; 

    _sortAlgorithm($self->array); 

    # ... 
} 

# Protected method here is the actual algorithm 
sub _sortAlgorithm { 
    die 'You must override _sortAlgorithm() in a subclass'; 
    # but Moose will always call the superclass which then makes it die 
} 

サブクラス

package OrderedSort; 
use namespace::autoclean; # Trims EXPORTER 
use Moose; 
extends 'AbstractSort'; 

# Override and mmpl _sortAlgorithm 
override _sortAlgorithm => sub { 
    my $self = shift; 
    # .... 
}; 

before '_sortAlgorithm' => sub { 
    my $self = shift; 
    # ... 

    return; 
}; 
+0

本当ですか? [mcve]を表示してください。あなたのコードにパッケージを追加すると、それは私のために働く。私はそれが 'die'とは見えず、' before'ハンドラが最初に呼び出されます。 – simbabque

+0

私はテストの例で投稿を編集しました – Mat0

答えて

3

あなたはを呼び出していますをメソッドとしてではなく、AbstractSort`の同じパッケージ内の関数として返します。

sub sortData { 
    my $self = shift; 

    # there is something missing here! 
    _sortAlgorithm($self->array); 
} 

このように、OOPメソッド呼び出しではないので、常に同じパッケージで呼び出されます。

代わりに$self->_sortAlgorithmを行う必要があります。これ以上

sub sortData { 
    my $self = shift; 

    print "Sorting data..\n"; 

    $self->_sortAlgorithm($self->array); 

    # ... 
} 

それはなり今ではないdie、それはあなたのサブクラスのインスタンスである$self_sortAlgorithm方法を、ルックアップするため。

オーバーライドされたメソッドに実際にmy $self = shiftがあるという事実は、それに$selfも渡していないので、それを与えている可能性があります。


また、$self->arrayを渡すべきではありません。アルゴリズムメソッドには$self->arrayへのアクセス権もありますので、オブジェクトに添付されているデータを並べ替える場合は、そこに直接使用してください。

また、Perlの典型的な命名規則は、snake_caseのメソッドと変数名、CamelCaseのパッケージ名を示唆していることにも注意してください。

関連する問題