नमस्ते बच्चों और माता-पिता, अहम Rubyists। एक पहले के लेख में, हम ancestry chain में गोता लगाए थे। आज के पोस्ट में, हम parenting और inheritance में गहराई से गोता लगाएंगे। हम inherited hook method का पता लगाएंगे और विरासत को रोकने में देखेंगे।
जब बच्चे विरासत में पाते हैं 101: The Inherited Hook Method
आइए देखें कि माता-पिता की घोषणा कैसे की जाती है। Ruby एक क्लास के साथ बातचीत करने का एक साफ तरीका प्रदान करता है जब इसे दूसरी क्लास के माता-पिता के रूप में घोषित किया जाता है।
class Parent
def self.inherited(subclass)
puts "#{subclass} inherits from Parent"
end
end
class Child < Parent
end
यह कोड "Child inherits from Parent" प्रिंट करता है, क्योंकि जब Child क्लास Parent से विरासत में लेती है तो Parent.inherited विधि को कॉल किया जाता है। ध्यान दें कि यह विधि सबक्लास को पैरामीटर के रूप में लेती है—हमारे मामले में Child। यह तंत्र आपको पैरेंट क्लास के साथ बातचीत करने की अनुमति देता है ताकि व्यवहारों का एक सेट केवल तभी परिभाषित किया जाए जब इसे विरासत में लिया जाए। व्यवहार से, इस संदर्भ में, हमारा मतलब है विरासत में लेने वाली या विरासत में दी गई क्लास पर वेरिएबल्स, विधियों और कॉन्स्टेंट्स को संशोधित, परिभाषित या हटाना।
अब, आइए parent_name विधि को ऑन-द-फ्लाई परिभाषित करें:
class Parent
def self.inherited(subclass)
subclass.define_method :parent_name do
"Daddy"
end
end
end
class Child < Parent
end
Child.new.parent_name # => "Daddy"
यहां, हम Child क्लास पर एक विधि परिभाषित करते हैं जब यह Parent क्लास से विरासत में लेती है, लेकिन उस विधि को सीधे Parent क्लास में जोड़े बिना। इसके बजाय, यह केवल तभी परिभाषित की जाती है जब कोई अन्य क्लास Parent से विरासत में लेती है।
ठीक है, हमने सिद्धांत को कवर किया है, अब आइए एक Rubyist के जीवन में एक अधिक यथार्थवादी उदाहरण देखें।
क्लास विरासत को रोकना
Ruby on Rails में, डेटाबेस माइग्रेशन को ActiveRecord::Migration क्लास द्वारा संभाला जाता है। आइए इस क्लास से सीधे विरासत लेने का प्रयास करें।
class AddFirstnameToUsers < ActiveRecord::Migration
end
# => StandardError (Directly inheriting from ActiveRecord::Migration is not supported..)
यह त्रुटि इसलिए उठाई जाती है क्योंकि Ruby on Rails एक तंत्र प्रदान करता है जो हमें इस क्लास से विरासत लेने से रोकता है। तो Ruby on Rails ने इस तंत्र को क्यों लागू किया?
एक माइग्रेशन Ruby on Rails के एक विशिष्ट संस्करण से दृढ़ता से जुड़ा होता है। वास्तव में, इस क्लास द्वारा प्रदान किया गया API दो संस्करणों के बीच थोड़ा बदल सकता है। इसलिए, जब आप Ruby on Rails को अपग्रेड करते हैं तो माइग्रेशन को टूटने से बचाने के लिए, फ्रेमवर्क आपको ActiveRecord::Migration क्लास के एक विशिष्ट संस्करण को चुनने के लिए मजबूर करता है। यह आपके माइग्रेशन के सुचारू संचालन को सुनिश्चित करता है।
class AddFirstnameToUsers < ActiveRecord::Migration[4.2]
end
उपरोक्त उदाहरण में, हमारा माइग्रेशन Ruby on Rails के संस्करण 4.2 के साथ प्रदान किए गए ActiveRecord::Migration API से जुड़ा हुआ है। इसलिए, भले ही हम अपने एप्लिकेशन को संस्करण 5.0 में अपग्रेड करें, हमारे माइग्रेशन अभी भी सुचारू रूप से चलेंगे क्योंकि वे अभी भी ActiveRecord::Migration API के संस्करण 4.2 के साथ चलेंगे।
विरासत को रोकना कैसे काम करता है
अब जब हम समझते हैं कि क्यों यहां विरासत को रोका जाता है, तो आइए देखें कि कैसे यह ActiveRecord::Migration विरासत को रोकता है। सारा तर्क ActiveRecord::Migration.inherited विधि में परिभाषित है।
class AddFirstnameToUsers < ActiveRecord::Migration[4.2]
end
जब हमारा AddFirstnameToUsers क्लास ActiveRecord::Migration से विरासत में लेता है, तो ActiveRecord::Migration.inherited हुक विधि को कॉल किया जाता है।
module ActiveRecord
class Migration
def self.inherited(subclass)
#:nodoc:
super if subclass.superclass == Migration
raise StandardError, "Directly inheriting from ActiveRecord::Migration is not supported. " \
"Please specify the Rails release the migration was written for:\n" \
"\n" \
" class #{subclass} < ActiveRecord::Migration[4.2]"
end
end
end
जैसा कि हम देख सकते हैं, यह हुक विधि जांचती है कि क्या सबक्लास (AddFirstnameToUsers) सीधे ActiveRecord::Migration से विरासत में लेता है। यदि यह करता है, तो एक त्रुटि उठाई जाती है। यह विरासत को नियंत्रित करने के लिए सही प्रवेश बिंदु है।
निष्कर्ष
आज, हमने विरासत और विरासत को रोकने की मूल बातें शामिल कीं। हमने inherited hook method को कवर किया और देखा कि यह ऑन-द-फ्लाई विरासत में लेने वाली/विरासत में दी गई क्लास के साथ बातचीत करते समय बहुत उपयोगी हो सकता है।
एक वास्तविक दुनिया की सेटिंग में, विरासत के साथ खेलते समय सावधान रहें। मौजूदा विधि या क्लास को हटाते या ओवरराइड करते समय बहुत सावधान रहें। इसके परिणामस्वरूप कुछ अवांछित दुष्प्रभाव हो सकते हैं। बच्चे आपको डैडी कहना बंद कर सकते हैं।
एट वोइला, यह आज के लिए हमारी पोस्ट का समापन करता है!