2009-09-06 27 views
13

मैंने देखा है कि जब आप एक सुपर क्लास के तरीकों कहते हैं, आप कुछ इस तरह करने की जरूरत है:पर्ल की सुपर कॉल तीर विधि का उपयोग क्यों नहीं करती है?

my $self = $class->SUPER::new(); 

क्यों कि नहीं है:

my $self = $class->SUPER->new(); 
+1

भौगोलिक, यदि आप पर्ल में ऑब्जेक्ट्स के नट किरकिरा विवरण सीखना चाहते हैं, तो डेमियन कॉनवे के ऑब्जेक्ट ओरिएंटेड पर्ल की एक प्रति चुनें http://www.manning.com/conway/ यह विभिन्न तरीकों से बहुत विस्तार से है पर्ल की ओओपी सुविधाओं का उपयोग करें। इसमें मूल धन्य हैश से डायनामिक विधि पीढ़ी तक, सबकुछ को धन्य कोडफ्रिक्स की तरह है। यह एक बहुत अच्छी तरह लिखित पुस्तक है। लेकिन मूस भी देखें। कई लोगों के लिए, यदि अधिकतर नहीं है, तो चीज ओओएल करने का सही तरीका मूस है। – daotoad

उत्तर

14

मुझे लगता है क्योंकि $class->SUPER->new() सामान्य रूप से के रूप में ही किया जाएगा $class->SUPER()->new()। लेकिन $class->SUPER() फ़ंक्शन नहीं है, और यह स्पष्ट नहीं है कि वह क्या करेगा।

दूसरी ओर, $class->Foo::Bar हमेशा एक पूर्ण विधि से विधि को कॉल करने का एक वैध तरीका रहा है, इसलिए एक विशेष पैकेज जैसी चीज बनाना - SUPER - बेहतर में फिट बैठता है। (मुझे लगता है कि आप वास्तव में SUPER एक पैकेज के रूप में लागू कर सकता है, और शायद यह ऐतिहासिक था, मैं नहीं पता है)

पुनश्च: mro पैकेज, और $self->next::method पर एक नजर डालें। इसके अलावा, यदि आप पर्ल में गंभीर ओओ काम करने जा रहे हैं तो मूस पर एक नज़र डालें।

+9

मैं मूस का उपयोग करने से पहले सामान को समझना चाहता हूं। – Geo

+3

Moose_ के लिए एक सज्जन परिचय देखें http://www.catalyzed.org/2009/06/a-gentle-introduction-to-moose.html –

+2

@ जीओओ, आप केवल * सोचते हैं * आप और जानना चाहते हैं। मैं ईमानदारी से आपको बता सकता हूं कि आप इसे तब तक नहीं जानते हैं जब तक आप इसे पार नहीं करते। –

7

को जोड़ने के लिए क्या derobert कहा करने के लिए:

आप कॉल कर रहे हैं 'सुपर' नाम स्थान में 'नए' लेकिन यह वस्तु (या स्ट्रिंग), '$ वर्ग' से गुजर रहा।

sub init { 
    my $self = shift; 
    $self->ParentClass1::init(); 
    $self->ParentClass2::init(); 
} 
+3

अन्य मामूली बात: आप वास्तव में '$ self-> पूरी तरह से संबंधित क्लास :: init() 'कर सकते हैं, हालांकि यह शायद सबसे अच्छा नहीं है! – derobert

13

विधि कॉल रूपों की एक संख्या है:

आप सुपर उपयोग करने के लिए, जैसा कि आप माता-पिता का पूरा पैकेज नाम (हीरा उत्तराधिकार के मामलों में उपयोगी) दे सकते हैं की जरूरत नहीं है:

कॉल विधि, संभवतः विरासत में मिला:

->method() 

स्पष्ट रूप से कहता है उप पैकेज :: विधि, चाहे वह विरासत पेड़ में है या नहीं:

->Package::method() 

स्पष्ट रूप से कहता है के लिए भेजा करने के लिए उप, चाहे वह विरासत पेड़ में है या नहीं:

->$coderef() 

विधि होता है कि __PACKAGE__->method() द्वारा बुलाया गया है अगर वहाँ थे में कोई उप विधि कॉल __PACKAGE__ (एनबी ,

->SUPER::method() 

ऊपर का कोई भी $method की सामग्री पर निर्भर करता है: वर्ग या -> की बाईं तरफ वस्तु अप्रासंगिक है)।

->$method() 

(कानूनी भी use strict; के तहत)

जबकि पहला रूप सबसे आम है, दूसरों के बारे में सीखना और वे कैसे काम करते हैं।

13

संक्षेप में, सुपर एक विधि नहीं है। यह एक आभासी पैकेज है। इसे "विधि आमंत्रण" अनुभाग के तहत perlobj में प्रलेखित किया गया है।

नोट, हालांकि, सुपरर वर्तमान पैकेज पर आधारित है, न कि उस उदाहरण के पैकेज के साथ जिसका आपने इसका उपयोग किया था।

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