2012-03-05 12 views
5

gibi davranan Moose sınıf özniteliği, Moose sınıfında bir sınıf özniteliğim var, ancak ebeveynin değerini geçersiz kılan bir alt sınıf açısından Class::Data::Inheritable gibi çalışmasını isterim. Yani, alt sınıf, alt sınıftaki ayarlayıcıya kadar ana değerin mirasını alır, bu noktada değerler ayrı olur. Örneğin.Sınıf :: Data :: Inheritable

#!/usr/bin/perl 
use warnings; 
use strict; 

{ 
    package Foo; 
    use Moose; 
    use MooseX::ClassAttribute; 
    class_has Item => (is => 'rw'); 
} 

{ 
    package Bar; 
    use Moose; 
    extends 'Foo'; 
} 

Foo->Item(4); 

# This prints "4, 4" as expected 
# 
print join(", ", Foo->Item(), Bar->Item()) . "\n"; 

Bar->Item(5); 

# Would like this to print "4, 5", but it prints "5, 5" 
# 
print join(", ", Foo->Item(), Bar->Item()) . "\n"; 

MooseX::ClassAttribute veya başka ile, bu etkiyi elde etmek için en iyi yolu nedir? Miras almayı bekleyen herhangi bir sınıf w/sınıf veri için istenen davranış gibi görünüyor.

+1

FWIW Sınıfı :: Veri :: Miras, Moose ile çakışmaz. – Schwern

+1

Schwern: Bu, Moose nesnelerinin Moose :: Object'ten miras alması gerekmesine rağmen, doğru olabilir, bu yüzden en azından çok muhtaç olur, bu da beni rahatsız eder. Ayrıca MooseX :: ClassAttribute'nin size verdiği Moose özellik beyanı iyiliğini almazsınız. –

cevap

0

Miras talebinde bulunduğunuzu biliyorum, ancak rollerin sizin sorununuzu farklı bir şekilde çözmenize yardımcı olabileceğine inanıyorum.

basit bir örnekle Deneyin:
#!/usr/local/bin/perl 

use strict; 
use feature 'say'; 

{ 
    package Bomb; 
    use Moose::Role; 
    sub fuse { say "Bomb explode" } 
    sub explode { say "Bomb fuse"} 
} 

{ 
    package Spouse; 
    use Moose::Role; 
    sub fuse { say "Spouse explode"} 
    sub explode { say "Spouse fuse"} 
} 

{ 
    package PracticalJoke; 
    use Moose; 
    with 'Bomb' => { excludes => 'explode' }, 
     'Spouse' => { excludes => 'fuse' }; 
} 

my $joke = PracticalJoke->new(); 
$joke->fuse(); 
$joke->explode(); 

Ve 'dışlar' tam olarak ne olacağına kontrol edebilirsiniz ile

.

why roles are awsome ve Ovid'den yaklaşık inheritance versus roles slaytlarına bakın.

+0

Bu bağlantıları cevabınızda burada özetlemek isteyebilirsiniz; Bu şekilde, eğer o bağlantılar hiç gitmezse, o zaman ortadan kaldırılma riskini kullanmazsınız. –

+0

Tamam. Söz konusu bağlantıdan örneği ekledim. – smartmeta