2010-02-21 14 views
5

मैं बाल वर्ग में पैरेंट फ़ंक्शन (Somefunc) को प्रतिस्थापित करना चाहता हूं, इसलिए जब मैं मुख्य प्रक्रिया को कॉल करता हूं तो इसे विफल होना चाहिए।मैं पर्ल में बच्चे के साथ एक अभिभावक वर्ग समारोह को कैसे ओवरराइड कर सकता हूं?

क्या यह पर्ल में संभव है?

कोड:

package Test; 

use strict; 
use warnings; 

sub Main() 
{ 
    SomeFunc() or die "Somefunc returned 0"; 
} 

sub SomeFunc() 
{ 
    return 1; 
} 

package Test2; 

use strict; 
use warnings; 

our @ISA = ("Test"); 

sub SomeFunc() 
{ 
    return 0; 
} 

package main; 

Test2->Main(); 
+1

असल में मुझे वास्तव में अन्य ओओ सुविधाओं की आवश्यकता नहीं है, जैसे वस्तुएं बनाना आदि। मेरे पास बच्चे के वर्गों में प्रतिस्थापित करने के लिए 1 या 2 सरल प्रक्रियाओं के साथ बहुत सारे बेस कोड हैं। – Miollnyr

उत्तर

4

जब आप Test2->Main() पर कॉल करते हैं, तो पैकेज नाम कॉल किए गए फ़ंक्शन के पहले पैरामीटर के रूप में पास किया जाता है। आप सही फ़ंक्शन को संबोधित करने के लिए पैरामीटर का उपयोग कर सकते हैं।

sub Main 
{ 
    my ($class) = @_; 
    $class->SomeFunc() or die "Somefunc returned 0"; 
} 

इस उदाहरण में, $class"Test2" हो जाएगा, तो आप Test2->SomeFunc() कॉल करेंगे। यहां तक ​​कि बेहतर समाधान उदाहरणों का उपयोग करना होगा (यानी, bless ऑब्जेक्ट Test::new में, $class के बजाय $self का उपयोग करें)। और Moose का उपयोग करना बेहतर होगा, जो पर्ल में ऑब्जेक्ट उन्मुख प्रोग्रामिंग के साथ कई समस्याएं हल करता है।

+0

धन्यवाद, यह काम करता है;) – Miollnyr

3

विरासत के लिए आपको,, विधियों के रूप में अपने कार्यों कॉल करने की आवश्यकता या तो एक वर्ग या एक वस्तु पर -> ऑपरेटर का उपयोग करके काम करने के लिए। ऐसा लगता है कि आपने Test2->Main() पर अपनी कॉल के लिए यह पता लगाया है, लेकिन सभी विधियां जिन्हें आप ओओ तरीके से व्यवहार करना चाहते हैं उन्हें इस तरह से कॉल किया जाना चाहिए।

package Test; 

use strict; 
use warnings; 

sub Main 
{ 
    my $class = shift; 
    $class->SomeFunc() or die "Somefunc returned 0"; 
} 

sub SomeFunc 
{ 
    return 1; 
} 

package Test2; 

our @ISA = ("Test"); 

sub SomeFunc 
{ 
    return 0; 
} 

package main; 

Test2->Main(); 

अधिक जानकारी के लिए एक सौम्य परिचय के लिए perlboot और perltoot देखें।

इसके अलावा, जब आप उन्हें घोषित करते हैं तो अपने सबराउटिन नामों के बाद माता-पिता को न रखें - यह आपके विचारों को नहीं करता है।

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

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