आपके द्वारा किए जा रहे कार्यों को करने के दो कारण हैं, दोनों खराब हैं।
सबसे पहले आप किसी कारण से अपने मूल वर्ग से विधियों को आयात करने की कोशिश कर रहे हैं ...। शायद आप गलत समझें कि ओओ कैसे काम करता है। आपको ऐसा करने की ज़रूरत नहीं है। बस विरासत विधियों को विधियों के रूप में कॉल करें और जब तक कि वे विधियां कुछ निराशाजनक न हों, यह ठीक काम करेगी।
अधिकतर यह मिश्रित उपयोग मॉड्यूल है जहां इनमें से कुछ विधियां हैं और इनमें से कुछ आयातित कार्य हैं। और इसके लिए आप कर सकते हैं ...
use base 'Foo::Base';
use Foo::Base;
और आपने सही ढंग से देखा कि यह अजीब दिखता है ... क्योंकि यह अजीब तरह का है।एक वर्ग जो निर्यात भी मुहावरे मिश्रण कर रहा है, और यह अजीब उपयोग पैटर्न में परिणामस्वरूप जा रहा है।
सर्वोत्तम काम करना है कि कार्यों को निर्यात करने के बजाय कक्षा को फिर से डिजाइन करना, या तो अपने मॉड्यूल में कार्यों को विभाजित करना, या उन्हें कक्षा विधियां बनाना है। यदि कार्यों में वास्तव में कक्षा के साथ बहुत कुछ नहीं है, तो उन्हें स्पिन करने के लिए सबसे अच्छा है। यदि वे कक्षा से संबंधित हैं, तो उन्हें कक्षा के तरीके बनाएं।
use base 'Foo::Base';
Foo::Base->some_function_that_used_to_be_exported;
यह इंटरफ़ेस बेमेल समाप्त, और एक बोनस के रूप में, उपवर्गों किसी भी अन्य विधि की तरह वर्ग विधि व्यवहार को ओवरराइड कर सकते हैं।
package Bar;
use base 'Foo::Base';
# override
sub some_function_that_used_to_be_exported {
my($class, @args) = @_;
...do something extra maybe...
$class->SUPER::some_function_that_used_to_be_exported(@args);
...and maybe something else...
}
आप आधार वर्ग पर नियंत्रण नहीं है, तो आप अभी भी इंटरफ़ेस एक उपवर्ग जो तरीकों में निर्यात कार्यों बदल जाता है लिख कर समझदार बना सकते हैं।
package SaneFoo;
use base 'Foo::Base';
# For each function exported by Foo::Base, create a wrapper class
# method which throws away the first argument (the class name) and
# calls the function.
for my $name (@Foo::Base::EXPORT, @Foo::Base::EXPORT_OK) {
my $function = Foo::Base->can($name);
*{$name} = sub {
my $class = shift;
return $function->(@_);
};
}
हां, यह मोजो :: बेस या कक्षा :: सरल, धन्यवाद के समान है! लेकिन मैंने बेहतर कोड आर्किटेक्चर के लिए छोड़ने का फैसला किया =) – shootnix