2012-03-05 14 views
5

पर काम करता है मुझे मूस क्लास में क्लास एट्रिब्यूट मिला है, लेकिन मैं इसे माता-पिता के मूल्य को ओवरराइड करने वाले उप-वर्ग के संदर्भ में Class::Data::Inheritable जैसे काम करना चाहता हूं। यही है, subclass माता-पिता के मूल्य को तब तक प्राप्त करता है जब तक कि सेटर को उप-वर्ग पर नहीं बुलाया जाता है, जिस बिंदु पर मान अलग हो जाते हैं। जैसेमूस क्लास एट्रिब्यूट जो क्लास :: डेटा :: इनरिएबल

#!/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 या अन्यथा इस प्रभाव को पाने का सबसे अच्छा तरीका क्या है? किसी भी वर्ग डब्ल्यू/क्लास-डेटा के लिए वांछनीय व्यवहार की तरह लगता है जो विरासत से प्राप्त होने की अपेक्षा करता है।

+1

एफडब्ल्यूआईडब्ल्यू कक्षा :: डेटा :: विरासत मूस के साथ संघर्ष नहीं करता है। – Schwern

+1

श्वार्न: यह सच हो सकता है, हालांकि मूस वस्तुओं को मूस :: ऑब्जेक्ट से उत्तराधिकारी होना है, इसलिए कम से कम वहां कई विरासत शामिल होंगे, जो मुझे परेशान करती हैं। इसके अलावा आपको मूस विशेषता घोषणा घोषणा में से कोई भी नहीं मिलता है कि MooseX :: ClassAttribute आपको देता है। –

उत्तर

0

मुझे पता है कि आपने विरासत के लिए कहा है लेकिन भूमिकाएं आपकी समस्या को अलग तरीके से सुलझाने में आपकी सहायता करेंगी।

एक सरल उदाहरण से यह प्रयास करें:

#!/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(); 

और 'शामिल नहीं' कि वास्तव में आप नियंत्रित कर सकते हैं कि क्या होने चाहिए साथ।

why roles are awsome और ओविड से inheritance versus roles पर स्लाइड देखें।

+0

आप यहां अपने लिंक में उन लिंक को सारांशित करना चाहते हैं; इस तरह यदि वे लिंक कभी दूर जाते हैं तो आप इसे कभी भी हटाए जाने का जोखिम नहीं चलाएंगे। –

+0

ठीक है। मैंने उल्लिखित लिंक से उदाहरण जोड़ा। – smartmeta

संबंधित मुद्दे