2013-09-23 5 views
6

मैं एक मूस :: रोल क्लास को लागू करने की कोशिश कर रहा हूं जो जावा में एक अमूर्त वर्ग की तरह व्यवहार करता है। मैं भूमिका में कुछ तरीकों को लागू करना चाहता हूं, लेकिन फिर ठोस वर्गों में उन विधियों को ओवरराइड करने की क्षमता है। यदि मैं कक्षाओं का विस्तार करता हूं तो उसी शैली का उपयोग करके यह कोशिश करता हूं मुझे त्रुटि Cannot add an override method if a local method is already present मिलती है।मूस :: रोल में सब को ओवरराइड कैसे करें?

मेरे सार वर्ग:

package AbstractClass; 

use Moose::Role; 

sub my_ac_sub { 

    my $self = shift; 

    print "In AbstractClass!\n"; 
    return; 
} 

1; 

मेरे ठोस वर्ग:

package Class; 

use Moose; 

with 'AbstractClass'; 

override 'my_ac_sub' => sub { 

    my $self = shift; 

    super; 
    print "In Class!\n"; 
    return; 
}; 

__PACKAGE__->meta->make_immutable; 
1; 

और फिर:

use Class; 

my $class = Class->new; 
$class->my_ac_sub; 

मैं कुछ गलत कर रहा हूँ यहाँ एक उदाहरण है? क्या मैं पूरा करने की कोशिश कर रहा हूं जिसे अलग तरीके से किया जाना चाहिए? क्या मैं ऐसा करने की कोशिश कर रहा हूं जो बिल्कुल नहीं किया जाना चाहिए?

+0

एक अमूर्त वर्ग का मॉडल करने के लिए एक अमूर्त वर्ग का उपयोग करें! यह आपको बस निर्माण को असंभव बनाने की आवश्यकता है (यानी एक बिल्ड प्रदान करें जो एक त्रुटि फेंकता है)। – amon

+1

शायद ऐसा करने का मूस तरीका 'my_ac_sub' की आवश्यकता है; 'भूमिका में, * नहीं * "वर्चुअल" विधि। मूस :: रोल तब जांच करेगा कि इसे उपलब्ध विधि के साथ कक्षा में बनाया गया है, –

+1

मैंने कोड चलाने की कोशिश की है और फिर 'sub my_ac_sub' द्वारा ओवरराइड को प्रतिस्थापित किया है और अचानक यह अपेक्षा के अनुसार काम करता है। क्या उस "फिक्स" में कुछ गड़बड़ है? (अस्वीकरण: मैं मूस के लिए नया हूँ)। – Dallaylaen

उत्तर

4

मैं इसे गलत तरीके से उपयोग कर रहा था बाहर कर देता है। मैं a ticket खोला और ऐसा करने का सही तरीका दिखाया गया था:

package Class; 

use Moose; 

with 'AbstractClass'; 

around 'my_ac_sub' => sub { 

    my $next = shift; 
    my $self = shift; 

    $self->$next(); 
    print "In Class!\n"; 
    return; 
}; 

__PACKAGE__->meta->make_immutable; 
1; 

यह परिवर्तन करने वांछित प्रभाव है।

2

Some time ago, मैंने ऐसा भूमिका निभाई जिसमें requires बयान शामिल हैं। वह सार आधार वर्ग बनाता है। उसके बाद, आप किसी अन्य वर्ग में अपने डिफ़ॉल्ट कार्यान्वयन रख दिया और उस से विरासत कर सकते हैं: आप केवल कुछ ही तरीकों भूमिका में परिभाषित के लिए डिफ़ॉल्ट कार्यान्वयन उपलब्ध कराना चाहते हैं

#!/usr/bin/env perl 

use 5.014; 

package AbstractClass; 

use Moose::Role; 

requires 'my_virtual_method_this'; 
requires 'my_virtual_method_that'; 

package DefaultImpl; 

use Moose; 
with 'AbstractClass'; 

sub my_virtual_method_this { 
    say 'this'; 
} 

sub my_virtual_method_that { 
    say 'that' 
} 

package MyImpl; 

use Moose; 
extends 'DefaultImpl'; 
with 'AbstractClass'; 

override my_virtual_method_that => sub { 
    super; 
    say '... and the other'; 
}; 

package main; 

my $x = MyImpl->new; 

$x->my_virtual_method_this; 
$x->my_virtual_method_that; 

, DefaultImpl से requires को हटा दें।

आउटपुट:

$ ./zpx.pl 
this 
that 
... and the other
+1

मुझे लगता है कि यह चारों ओर एक अच्छा काम है। यह "साफ महसूस नहीं करता" है, लेकिन मैं इसके लिए एक विशलिस्ट सूची जमा करूंगा। इस उत्तर के लिए धन्यवाद। – Joel

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