2011-02-11 12 views
12

Alt sınıflı olması amaçlanan bir Moose sınıfım var ve her alt sınıf bir "yürütme" yöntemini uygulamak zorunda. Ancak, sınıfımdaki yürütme yöntemine bir yöntem değiştirici uygulamak istiyorum, böylece tüm alt sınıflardaki yürütme yöntemine uygulanır. Ancak, yöntem geçersiz kılındığında yöntem değiştiricileri korunmaz. Sınıfımın tüm alt sınıflarının benim yöntem değiştiricilere kendi yürütme yöntemlerine uygulanmasını sağlamak için herhangi bir yolu var mı?Perl/Moose'da, tüm alt sınıflardaki bir yönteme nasıl bir değiştirici uygulayabilirim?

Örnek: bunun bir alt sınıfta, sonra

before execute => sub { 
    print "Before modifier is executing.\n" 
} 

: Bir üst, ben bu var

sub execute { 
    print "Execute method is running.\n" 
} 

yürütmek yöntem çağrıldığında, bu konuda hiçbir şey söylemez "önceki" değiştirici.

cevap

9

Bu, augment yöntem değiştiricisinin yapıldığı şeydir. Eğer üst sınıfta bu koyabilirsiniz: En alt sınıfları doğrudan execute geçersiz kılmak için izin vermek yerine, daha sonra

sub execute { 
    print "This runs before the subclass code"; 
    inner(); 
    print "This runs after the subclass code"; 
} 

Ve, onlara augment var o:

augment 'execute' => sub { 
    print "This is the subclass method"; 
}; 

Temelde bu size sadece around gibi fonksiyonellik sağlıyor değiştirici, ebeveyn/çocuk ilişkisi dışında değişti.

+2

Hmm. Üst sınıfımın aslında alt sınıflarının bir yürütme yöntemi bildirmesini bekleyen başka bir Moose olmayan sınıftan miras kaldığını söylemeyi unutmuşum, bu yüzden büyütme/iç çalışmaz. Ama genel olarak bunun çözüm olduğuna katılıyorum. Benim özel problemime gelince, değiştiricimi * çağrıları * yürütme yöntemine koyabildiğimi öğrendim, çünkü bu yöntem alt sınıflarda hiçbir zaman yeniden tanımlanmıyor veya geçersiz kılmıyor. Yani sanırım kabul edildim. –

+0

@Ryan Thompson, Bunu denemedim, ebeveynler ve çocuklar arasında neredeyse boş bir Moose dersi koyabilirsiniz. Ardından "hobbs" yürütme yöntemini Moose adaptör sınıfınıza koyun, diğer her şeyi devralır ve işte oraya gidersiniz. ** Uyarı: Tecavüz edilmemiş, denenmemiş, tüylü bir insanın kötü düşünülmüş düşkünleri - aşırı dikkatle kullanın. ** – daotoad

+1

@Ryan ama süper sınıfı * bir yürütme yöntemini bildirir * ve * sınıfın bir alt sınıfı olmasını bekler * Alt sınıfları bir yürütme yöntemi ilan etmek için, hepsi de büyütme/iç ile koşer. Ağaçta gerçekte yöntem eklendiğinde * * alakasız olmalıdır. – hobbs

İlgili konular