नमस्कार बच्चों और माता-पिता, अहम रूबीस्ट्स। पहले के एक लेख में, हम पूर्वजों की श्रृंखला में प्रवेश करते हैं। आज की पोस्ट में, हम पेरेंटिंग और इनहेरिटेंस के बारे में गहराई से जानेंगे। हम इनहेरिट की गई हुक विधि का पता लगाएंगे और इनहेरिटेंस को रोकने पर विचार करेंगे।
जब किड्स इनहेरिट 101:द इनहेरिटेड हुक मेथड
आइए देखें कि पितृत्व कैसे घोषित किया जाता है। रूबी एक वर्ग के साथ बातचीत करने का एक साफ-सुथरा तरीका प्रदान करती है जब इसे किसी अन्य वर्ग के माता-पिता के रूप में घोषित किया जाता है।
class Parent
def self.inherited(subclass)
puts "#{subclass} inherits from Parent"
end
end
class Child < Parent
end
इस कोड को चलाने से Parent.inherited
के रूप में "माता-पिता से विरासत में मिला बच्चा" प्रिंट हो जाता है विधि को तब कहा जाता है जब Child
वर्ग Parent
. से विरासत में मिला है . ध्यान दें कि यह विधि उपवर्ग को पैरामीटर के रूप में लेती है—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
. से विरासत में मिलता है ।
ठीक है, हमने सिद्धांत को कवर कर लिया है, अब आइए एक रूबीवादी के जीवन में एक अधिक यथार्थवादी उदाहरण देखें।
वर्ग वंशानुक्रम रोकें
रूबी ऑन रेल्स में, डेटाबेस माइग्रेशन को ActiveRecord::Migration
द्वारा नियंत्रित किया जाता है कक्षा। आइए इस वर्ग से सीधे इनहेरिट करने का प्रयास करें।
class AddFirstnameToUsers < ActiveRecord::Migration
end
# => StandardError (Directly inheriting from ActiveRecord::Migration is not supported..)
यह त्रुटि इसलिए उठाई जाती है क्योंकि रूबी ऑन रेल्स एक ऐसा तंत्र प्रदान करता है जो हमें इस वर्ग से विरासत में मिलने से रोकता है। तो रूबी ऑन रेल्स ने इस तंत्र को क्यों लागू किया?
रूबी ऑन रेल्स के एक विशिष्ट संस्करण के साथ माइग्रेशन को मजबूती से जोड़ा जाता है। दरअसल, इस वर्ग द्वारा प्रदान किया गया एपीआई 2 संस्करणों के बीच थोड़ा बदल सकता है। इसलिए, जब आप रूबी ऑन रेल्स को अपग्रेड करते हैं तो ब्रेकिंग माइग्रेशन से बचने के लिए, फ्रेमवर्क आपको ActiveRecord::Migration वर्ग का एक विशिष्ट संस्करण चुनने के लिए मजबूर करता है। यह आपके माइग्रेशन को सुचारू रूप से चलाना सुनिश्चित करता है।
class AddFirstnameToUsers < ActiveRecord::Migration[4.2]
end
ऊपर के उदाहरण में, हमारा माइग्रेशन ActiveRecord::Migration
. से जुड़ा है रेल पर रूबी के संस्करण 4.2 के साथ एपीआई प्रदान किया गया। इसलिए, भले ही हम अपने एप्लिकेशन को संस्करण 5.0 में अपग्रेड करें, फिर भी हमारे माइग्रेशन सुचारू रूप से चलेंगे क्योंकि वे अभी भी ActiveRecord::Migration
के संस्करण 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
end
जैसा कि हम देख सकते हैं, यह हुक विधि जाँचती है कि क्या उपवर्ग (AddFirstnameToUsers
) सीधे ActiveRecord::Migration
. से इनहेरिट करता है . यदि ऐसा होता है, तो एक त्रुटि उठाई जाती है। विरासत को नियंत्रित करने के लिए यह सही प्रवेश बिंदु है।
निष्कर्ष
आज, हमने वंशानुक्रम की मूल बातें और वंशानुक्रम को रोकना शामिल किया है। हमने इनहेरिट की गई हुक मेथड को कवर किया और देखा कि इनहेरिटिंग/इनहेरिट की गई क्लास ऑन-द-फ्लाई के साथ इंटरैक्ट करते समय यह कैसे बहुत आसान हो सकता है।
वास्तविक दुनिया की सेटिंग में, विरासत के साथ खेलते समय देखें। किसी मौजूदा विधि या वर्ग को हटाते या ओवरराइड करते समय बहुत सावधान रहें। इसके परिणामस्वरूप कुछ अवांछित दुष्प्रभाव हो सकते हैं। बच्चे आपको डैडी कहना बंद कर सकते हैं।
Et Voilà, यह आज की हमारी पोस्ट को समाप्त करता है!