2009-08-27 24 views
6

के लिए पर्ल के साथ मूस के उपयोग की तरह मैं मूस के साथ खेल रहा हूं, इसके लिए एक महसूस कर रहा हूं। मुझे सी ++ में शुद्ध वर्चुअल फ़ंक्शंस का उदाहरण चाहिए, लेकिन मूस पैरालांस में (विशेष रूप से सी ++ - दिखने वाले तरीके में)। मुझे पता है कि मूस के साथ सामान्य पर्ल की तुलना में एक कठोर मॉडल लगाते हुए, मैं जो भी पूछ रहा हूं उसे करने के लिए अभी भी एक से अधिक तरीके हैं (विधि संशोधक या SUPER:: कॉल के माध्यम से)। यही कारण है कि मैं विशेष रूप से जितना संभव हो सके C++ जैसा कार्यान्वयन के लिए पूछ रहा हूं। "क्यों?" के लिए इस प्रतिबंध का? अधिकतर जिज्ञासा, लेकिन मूस के साथ पर्ल को कुछ सी ++ कोड पोर्ट करने की भी योजना बना रही है, जिस तरह से सी ++ - केंद्रित लोग अधिकतर पहचान सकते हैं।सी ++ - ओओपी

+0

मैंने प्रश्न से नीचे दिए गए उत्तर अनुभाग में अपना प्रयास स्थानांतरित कर दिया। –

+1

यिक्स, यह सवाल पहले से ही तीसरी प्रतिक्रिया है जब मूस के साथ पर्ल में शुद्ध आभासी कार्यों के लिए गुगलिंग। रुचि रखने वालों के लिए, इससे संबंधित अर्ध-संबंधित पर्लमोक्स चर्चा यहां है: http://www.perlmonks.org/?node_id=742013। ऐसा लगता है कि वे वहां पर ठोस जवाब नहीं लगते हैं। –

+0

शायद क्योंकि सी ++ प्रोग्रामर को छोड़कर हर कोई उन्हें "विधियों" कहते हैं। – jrockway

उत्तर

5

मैं इस तरह से उपवर्गीकरण के बजाय भूमिकाओं का उपयोग कर के बारे में सोच सकते हैं: क्योंकि रियल सामान परिभाषित नहीं है

{ 
    package AbstractRole; 
    use Moose::Role; 
    requires 'stuff'; 
} 

{ 
    package Real; 
    use Moose; 
    with 'AbstractRole'; 
} 

यह एक संकलन त्रुटि दे देंगे।

रियल के लिए सामान विधि जोड़ना अब यह काम कर देगा:

{ 
    package Real; 
    use Moose; 
    with 'AbstractRole'; 

    sub stuff { print "Using child function!\n" } 
} 
+0

हाँ, अगर यह केवल एक इंटरफेस चाहता था तो यह किया जाएगा। मैं यहां शोध और चर्चा के माध्यम से पता लगा रहा हूं कि मैं _exactly_ करने में सक्षम नहीं हूं जो मैं करने की उम्मीद कर रहा हूं। –

+0

मुझे लगता है कि यह आपको सबसे अधिक पसंद करता है हालांकि। Irc.perl.org पर #moose पर मूस लोगों के साथ चैट करें या मेलिंग सूची [email protected] अगर आपको लगता है कि इसे आगे बढ़ाने में कोई फायदा है। – draegtun

+0

@draegtun हाँ, मुझे लगता है कि यह सबसे अच्छा अनुमान है जिसके लिए मैं उम्मीद कर सकता हूं। आपकी सहायताके लिए धन्यवाद! –

1

यहाँ है (अन्य उत्तर भूमिकाएँ देखें के बारे में जानकारी के लिए भूमिकाओं के बिना,) मेरा प्रयास था:

package Abstract; 
use Moose; 

sub stuff; 

package Real; 
use Moose; 
extends 'Abstract'; 

override 'stuff' => sub { print "Using child function!\n"; } 
+0

मुझे नहीं पता कि आप किस बारे में बात कर रहे हैं, लेकिन ऐसा लगता है कि आप शुद्ध सारणी होने के लिए 'सार' को एक सार आधार वर्ग और 'सामान' विधि (कार्य नहीं) करना चाहते हैं। बस 'सब सामान {}' लिखना तुरंत उल्लंघन करता है। तो, बेस क्लास विधि शायद 'सब सामान {croak} 'होना चाहिए। –

+0

@ सिनन मैं सी ++ की तरह कुछ के लिए जा रहा था: आभासी शून्य सामान() = 0; –

+0

@ सिनन मुझे सामग्री के लिए क्रोक जोड़ने के साथ दो चिंताएं हैं: 1) यह मेरे लिए संकलित नहीं हुआ और 2) आप तर्क दे सकते हैं कि क्रोक कार्यान्वयन का एक रूप है, (जब तक कि मैं शुद्ध आभासी कार्यों की परिभाषा को गलत व्याख्या नहीं कर रहा हूं) वास्तव में इसके विपरीत है जो मैं जा रहा हूं। मैं सब सामान संपादित कर रहा हूँ {; } उप सामान होने के लिए; –

2

ऐसा प्रतीत होता है कि मैं वास्तव में क्या मैं मूस के साथ चाहते हैं नहीं कर सकते, लेकिन मैं बहुत करीब आ सकते हैं भूमिकाओं के साथ। बनाम सार आधार वर्ग

भूमिकाओं

आप अन्य भाषाओं में सार आधार वर्ग की अवधारणा से परिचित हैं, तो आप परीक्षा जा सकता है: यहाँ भूमिकाओं के लिए मूस मैनुअल entry से जानकारी है उसी तरह भूमिकाओं का उपयोग करने के लिए।

आप "इंटरफ़ेस-केवल" भूमिका को परिभाषित कर सकते हैं, जिसमें केवल आवश्यक विधियों की एक सूची शामिल है।

हालांकि, किसी भी वर्ग है जो इस भूमिका की खपत आवश्यक तरीकों के सभी को लागू करना चाहिए, या तो सीधे या एक माता पिता से विरासत के माध्यम से। आप विधि आवश्यकता जांच में देरी नहीं कर सकते हैं ताकि भविष्य में उप-वर्गों द्वारा उन्हें लागू किया जा सके।

क्योंकि भूमिका आवश्यक विधियों को सीधे परिभाषित करती है, मिश्रण के लिए बेस क्लास जोड़ना कुछ भी प्राप्त नहीं करेगा। हम अनुशंसा करते हैं कि आप प्रत्येक वर्ग में इंटरफ़ेस भूमिका का उपभोग करें जो उस इंटरफ़ेस को लागू करता है।

+0

स्नैप करें! आपका जवाब ठीक उसी तरह दिखाई दिया जब मैं मेरा खनन कर रहा था ;-) – draegtun

+0

@draegtun मजेदार कैसे होता है! आपका जवाब वास्तव में सहायक है, खासकर उन लोगों के लिए जो मूस के साथ इंटरफेस को कार्यान्वित करना चाहते हैं। मैं बस एक अजीब सवाल के साथ आया कि मुझे आगे के शोध के माध्यम से मिल रहा है, यह एक निर्धारक जवाब नहीं हो सकता है। मैं अभी भी यह तय करने की कोशिश कर रहा हूं कि ऐसा इसलिए है क्योंकि मैं पूछने से पहले क्षेत्र को पूरी तरह से समझ नहीं पाया था, या यदि मूस इस सुविधा को याद कर रहा है;) –

+2

हम्म। क्या यह सिर्फ मुझे है या क्या वह वास्तव में मददगार नहीं है? ऐसा लगता है कि 'यदि आप एक सार के साथ एक अमूर्त वर्ग को कार्यान्वित करना चाहते हैं तो यह काम नहीं करता है क्योंकि वे एक ही चीज़ नहीं हैं; इसके बजाय, * वहाँ एक उड़ान सुअर * देखो! मुझे अभी भी दिलचस्पी होगी (ए) अमूर्त वर्गों का पदानुक्रम कैसे करें (विशेष रूप से यदि मूसएक्स :: एबीसी अच्छा माना जाता है या नहीं) या वैकल्पिक रूप से (बी) क्यों एमबीसी कार्यक्रमों के लिए एबीसी खराब हैं। – ijw

5

तुम भी जेसी Luehrs ' MooseX::ABC पर एक नज़र लेने के लिए चाहते हो सकता है। यह कुछ कार्यान्वयन के समान ही लगता है। सारांश से:

package Shape; 
use Moose; 
use MooseX::ABC; 

requires 'draw'; 

package Circle; 
use Moose; 
extends 'Shape'; 

sub draw { 
    # stuff 
} 

my $shape = Shape->new; # dies 
my $circle = Circle->new; # succeeds 

package Square; 
use Moose; 
extends 'Shape'; # dies, since draw is unimplemented 

मुझे पता है कि जेसी दिन के दौरान एक सी ++ प्रोग्रामर है।

+0

टिप के लिए धन्यवाद, मैं निश्चित रूप से इसे देख लूंगा! –

+0

संस्करण 0.20 पर वर्तमान संस्करण पर इंगित करने से अद्यतन लिंक। संस्करण 0.30 ने आगे सार वर्गों के साथ सार वर्ग वर्गीकरण subclassing जोड़ा। – spazm

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