मैं अच्छी तरह से ग्राउंडेड रूबीस्ट पढ़ रहा हूं और यह उल्लेख करता है कि कक्षा को अपनी सुपर क्लास के उदाहरण विधियों को कैसे प्राप्त किया जाता है ताकि कक्षा की वस्तुएं उन उदाहरण विधियों को कॉल कर सकें। यहाँ एक उदाहरण है:रूबी विरासत को समझना
class C
def run_instance_method
puts "This is an instance method."
end
def C.run_class_method
puts "This is a class method."
end
end
class D < C
end
मैं क्या पढ़ा है, यह हमेशा उस वर्ग डी क्लास सी का सिर्फ उदाहरण तरीकों (इस स्थिति में, सी :: run_class_method द्वारा विरासत में मिला नहीं किया जाएगा वारिस होगा वर्णित किया गया है के आधार पर डी)। हालांकि, इसके बाद के संस्करण कोड चलाने के बाद, मैं ध्यान दें कि:
D.run_class_method # => "This is a class method."
यहाँ क्यों यह हो रहा है के रूप में मेरा अनुमान है और मुझे पता है कि अगर यह सही समझ है तो कृपया। यदि कक्षा डी का एक उदाहरण डी है और आप d.run_instance_method को चलाने का प्रयास करते हैं, तो वह ऑब्जेक्ट अपना विधि-लुकअप पथ खोजेगा और देखें कि क्या यह विधि इसके सिंगलटन क्लास, अपनी कक्षा में या इसके सुपरक्लास में परिभाषित की गई है। चूंकि run_instance_method को कक्षा सी में परिभाषित किया गया है, इसलिए कोई समस्या नहीं होगी और run_instance_method को कॉल किया जाएगा। क्लास ऑब्जेक्ट डी (जो सी और ऑब्जेक्ट का उप-वर्ग है) के लिए, यदि D.run_class_method कहा जाता है, तो यह फिर से डी क्लास ऑब्जेक्ट के लिए विधि लुकअप पथ की जांच करेगा। दोबारा, रुबी इसे क्लास ऑब्जेक्ट सी में मिलेगा।
क्या यह तर्क सटीक है?
धन्यवाद। यदि आप इस स्पष्टीकरण के साथ गलत हैं तो क्या आप मुझे सही कर सकते हैं: मूल रूप से, सभी वर्ग विधियां उनके ईजेनक्लास में उदाहरण विधियों के रूप में रहते हैं। यदि कक्षा डी को अपने सुपरक्लास क्लास सी से विरासत में मिला है, तो क्लास डी के ईजेनक्लास को कक्षा सी के ईजेनक्लास से भी विरासत में मिला है। और इस कारण से क्लास ऑब्जेक्ट डी कॉल कर सकता है .run_class_method। क्या यह सही है? – wmock
बिल्कुल! जब रूबी एक विधि आमंत्रण अभिव्यक्ति का मूल्यांकन करता है तो पहले यह पता लगाना होगा कि किस विधि को लागू करने की आवश्यकता है। इसे 'विधि लुकअप' कहा जाता है: स्वयं वर्ग में विधि परिभाषा के लिए पहली खोज, यदि कोई विधि नहीं मिलती है, तो श्रृंखला मूल तक कक्षा अभिभावक आदि में खोजें। –