2017-08-14 96 views
2

我試圖用Perl和Moose創建抽象方法模式。我不明白的是,如果我覆蓋抽象類中的方法,它最終將被調用。爲什麼會這樣,並且有沒有辦法避免超類被調用?Perl - 使用overriden方法避免super()被稱爲

主要

package main; 
use AbstractSort; 
use OrderedSort; 

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

抽象類

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]。如果我將代碼包添加到您的代碼中,它適用於我。我沒有看到它'死亡',並且'before'處理程序首先被調用。 – simbabque

+0

我已經使用測試示例編輯了帖子 – Mat0

回答

3

要調用_sortAlgorithm作爲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包名稱。