2012-06-19 22 views
6

में वर्चुअल फ़ंक्शन को कैसे लागू करें सी # में, हमारे पास अमूर्त विधि के बारे में अवधारणा है, और जावास्क्रिप्ट में इसे कैसे लागू करें।जावास्क्रिप्ट

function BaseClass() { 
    this.hello = function() { 
     this.talk(); 
    } 
    this.talk = function() { 
     alert("I'm BaseClass"); 
    } 
}; 

function MyClass() { 
    this.talk = function() { 
     alert("I'm MyClass"); 
    } 
    BaseClass.call(this); 
}; 

MyClass.prototype = new BaseClass(); 

var a = new MyClass(); 
a.hello();​ 

कैसे समारोह नमस्ते() BaseClass में MyClass से() फ़ंक्शन कर फोन जब वस्तु MyClass का एक उदाहरण है: उदाहरण के लिए, मैं एक उदाहरण है। चेतावनी परिणाम "मैं MyClass" होना चाहिए। क्रिप्या मेरि सहायता करे। धन्यवाद।

+2

मुझे लगता है कि आपका मतलब 'वर्चुअल'/'ओवरराइड' था, न कि 'अमूर्त'। – HackedByChinese

+0

हां, बेस का फ़ंक्शन वर्चुअल फ़ंक्शन होना चाहिए ताकि उत्तराधिकारी वर्ग इसे ओवरराइड कर सके। –

+0

मुझे यकीन नहीं है कि मैं समझता हूं। बस 'BaseClass.call (यह) हटाएं;' लाइन और यह काम करता है, क्योंकि 'this.talk = ...' मूल विधि को ओवरराइड करता है। या आप 'MyClass' को 'BaseClass.call (...)' (शुरुआत में, अंत में नहीं) के साथ शुरू कर सकते हैं। लेकिन यदि आप 'कॉल' का उपयोग कर रहे हैं तो प्रोटोटाइप को परिभाषित करने की कोई आवश्यकता नहीं है। – freakish

उत्तर

7

आप "बेस" निर्माता पहले कॉल करने के लिए चाहते हो सकता है:

function MyClass() { 
    BaseClass.call(this); 
    this.talk = function() { 
     alert("I'm MyClass"); 
    } 
} 

अन्यथा BaseClass.talkMyClass.talk ऊपर लिख देगा।

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

4

आप BaseClass.call(this);

function MyClass() { 
    //BaseClass.call(this); // Not really necessary unless you run code inside your base class 
    this.talk = function() { 
     alert("I'm MyClass"); 
    } 
}; 

कर यह आपके कोड काम होगा द्वारा अपने कार्य अधिभावी कर रहे हैं। MyClass.prototype = new BaseClass(); को आपके a ऑब्जेक्ट पर हैलो फ़ंक्शन उपलब्ध कराया जाना चाहिए।

4

समस्या यह है कि आप वास्तव में MyClass और BaseClass रचनाकारों में निजी उदाहरण विधियों को परिभाषित कर रहे हैं। यह प्रोटोटाइप विधि लुकअप को ओवरराइड करता है, क्योंकि talk विधियां प्रोटोटाइप में स्थित नहीं हैं लेकिन वास्तविक आवृत्ति गुण हैं, और BaseClass कन्स्ट्रक्टर MyClass कन्स्ट्रक्टर के बाद लागू किया गया है, इस प्रकार talk संपत्ति को ओवरराइट कर रहा है। वास्तविक प्रोटोटाइप विरासत के साथ

Demonstration