ओवरराइडिंग विधि: Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|Language feature in object-oriented programming}} thumb|चित्रणऑब्जेक्ट ओरि...")
 
No edit summary
 
(6 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Short description|Language feature in object-oriented programming}}
{{Short description|Language feature in object-oriented programming}}
[[File:Method overriding in subclass.svg|thumb|चित्रण]][[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में मेथड ओवरराइडिंग, एक लैंग्वेज फीचर है जो एक सबक्लास (कंप्यूटर साइंस) या चाइल्ड क्लास को एक मेथड (कंप्यूटर साइंस) का एक विशिष्ट कार्यान्वयन प्रदान करने की अनुमति देता है जो पहले से ही इसके सुपरक्लास (कंप्यूटर साइंस) में से एक द्वारा प्रदान किया गया है। या अभिभावक वर्ग। वर्चुअल नेटवर्क इंटरफेस में डेटा-संचालित एल्गोरिथम-निर्धारित पैरामीटर प्रदान करने के अलावा,<ref>{{cite journal |last1=Zhang |first1=Jie |title=A novel P2P overridden API for open data communications in WWW |journal=2015 IEEE International Conference on Consumer Electronics-Taiwan |date=2015}}</ref> यह एक विशिष्ट प्रकार के बहुरूपता_(कंप्यूटर_साइंस) (उपप्रकार) के लिए भी अनुमति देता है। उपवर्ग में कार्यान्वयन सुपरक्लास में कार्यान्वयन को एक विधि प्रदान करके ओवरराइड (प्रतिस्थापित) करता है जिसमें समान नाम, समान [[पैरामीटर (कंप्यूटर विज्ञान)]] या हस्ताक्षर, और मूल वर्ग में विधि के समान रिटर्न प्रकार होता है।<ref name="flanagan">Flanagan 2002, p. 107</ref> निष्पादित की जाने वाली विधि का संस्करण ऑब्जेक्ट (कंप्यूटर विज्ञान) द्वारा निर्धारित किया जाएगा जिसका उपयोग इसे लागू करने के लिए किया जाता है। यदि पैरेंट क्लास के किसी ऑब्जेक्ट का उपयोग विधि को लागू करने के लिए किया जाता है, तो पैरेंट क्लास में संस्करण को निष्पादित किया जाएगा, लेकिन यदि उपवर्ग के किसी ऑब्जेक्ट का उपयोग विधि को लागू करने के लिए किया जाता है, तो चाइल्ड क्लास में संस्करण निष्पादित किया जाएगा।<ref name="lewis-loftus">Lewis & Loftus 2006, p.454</ref> यह डिफरेंशियल रिले एनालिटिक्स से जुड़ी समस्याओं को रोकने में मदद करता है जो अन्यथा एक फ्रेमवर्क पर निर्भर करती हैं जिसमें विधि ओवरराइडिंग को कम किया जा सकता है।<ref>{{cite journal |last1=Overbey |first1=J |title=Differential precondition checking: A lightweight, reusable analysis for refactoring tools |journal=26th IEEE/ACM International Conference on Automated Software Engineering (ASE 2011) |date=2011}}</ref><ref>{{cite journal |last1=Li |first1=K |title=Residual investigation: Predictive and precise bug detection |journal=ACM Transactions on Software Engineering and Methodology (TOSEM) |date=2014 |volume=24 |issue=2}}</ref> कुछ भाषाएँ [[प्रोग्रामर]] को किसी विधि को ओवरराइड होने से रोकने की अनुमति देती हैं।
[[File:Method overriding in subclass.svg|thumb|चित्रण]][[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग|वस्तु उन्मुख प्रोग्रामिंग]] में पद्धति '''ओवरराइडिंग''', एक भाषा सुविधा है जो एक सबक्लास (कंप्यूटर विज्ञान) या चाइल्ड क्लास को एक पद्धति (कंप्यूटर विज्ञान) का एक विशिष्ट कार्यान्वयन प्रदान करने की स्वीकृति देता है जो पहले से ही इसके सुपरक्लास (कंप्यूटर विज्ञान) या पेरेंट क्लास मे से एक द्वारा प्रदान किया गया है। वर्चुअल नेटवर्क इंटरफेस में डेटा-संचालित एल्गोरिथम-निर्धारित पैरामीटर (मानदंड) प्रदान करने के अतिरिक्त,<ref>{{cite journal |last1=Zhang |first1=Jie |title=A novel P2P overridden API for open data communications in WWW |journal=2015 IEEE International Conference on Consumer Electronics-Taiwan |date=2015}}</ref> यह एक विशिष्ट प्रकार के बहुरूपता (सबटाइपिंग) की भी स्वीकृति देता है। सबक्लास में कार्यान्वयन सुपरक्लास में कार्यान्वयन को एक पद्धति प्रदान करके ओवरराइड (प्रतिस्थापित) करता है जिसमें समान नाम, समान [[पैरामीटर (कंप्यूटर विज्ञान)]] या हस्ताक्षर, और बेस क्लास में पद्धति के समान निर्वाचित प्रकार होता है।<ref name="flanagan">Flanagan 2002, p. 107</ref> निष्पादित की जाने वाली पद्धति का संस्करण उस वस्तु (कंप्यूटर विज्ञान) द्वारा निर्धारित किया जाएगा जिसका उपयोग इसे प्रयुक्त करने के लिए किया जाता है। यदि पैरेंट क्लास के किसी वस्तु का उपयोग पद्धति को प्रयुक्त करने के लिए किया जाता है, तो पैरेंट क्लास में संस्करण को निष्पादित किया जाएगा, लेकिन यदि सबक्लास के किसी वस्तु का उपयोग पद्धति को प्रयुक्त करने के लिए किया जाता है, तो चाइल्ड क्लास में संस्करण निष्पादित किया जाएगा।<ref name="lewis-loftus">Lewis & Loftus 2006, p.454</ref> यह विभेदक प्रसारण विश्लेषक से जुड़ी समस्याओं को रोकने में सहायता करता है जो अन्यथा एक रूपरेखा पर निर्भर करती हैं जिसमें पद्धति ओवरराइडिंग को कम किया जा सकता है।<ref>{{cite journal |last1=Overbey |first1=J |title=Differential precondition checking: A lightweight, reusable analysis for refactoring tools |journal=26th IEEE/ACM International Conference on Automated Software Engineering (ASE 2011) |date=2011}}</ref><ref>{{cite journal |last1=Li |first1=K |title=Residual investigation: Predictive and precise bug detection |journal=ACM Transactions on Software Engineering and Methodology (TOSEM) |date=2014 |volume=24 |issue=2}}</ref> कुछ भाषाएँ [[प्रोग्रामर]] को किसी पद्धति को ओवरराइड होने से रोकने की स्वीकृति देती हैं।


== भाषा-विशिष्ट उदाहरण ==
== भाषा-विशिष्ट उदाहरण ==


=== अदा ===
=== एडीए ===
[[एडा (प्रोग्रामिंग भाषा)]] डिफ़ॉल्ट रूप से ओवरराइडिंग विधि प्रदान करती है।
[[एडा (प्रोग्रामिंग भाषा)|एडीए (प्रोग्रामिंग भाषा)]] डिफ़ॉल्ट रूप से '''ओवरराइडिंग पद्धति''' प्रदान करती है। प्रारम्भिक त्रुटि का पता लगाने के पक्ष में (उदाहरण के लिए एक गलत वर्तनी), यह निर्दिष्ट करना संभव है कि किस पद्धति के वास्तव में ओवरराइडिंग होने की अपेक्षा है, या नहीं। वह संकलक द्वारा जाँच की जाएगी।
जल्दी त्रुटि का पता लगाने के पक्ष में (उदाहरण के लिए एक गलत वर्तनी),
   type T is new Controlled with ......;
यह निर्दिष्ट करना संभव है कि कब एक विधि
  procedure Op(Obj: in out T; Data: in Integer);
वास्तव में ओवरराइडिंग होने की उम्मीद है, या नहीं। वह संकलक द्वारा जाँच की जाएगी।
<वाक्यविन्यास लैंग = एडीए>
  type NT is new T with null record;
   टाइप टी ...... के साथ नया नियंत्रित है;
  overriding    -- overriding indicator
  प्रक्रिया ओप (ओबीजे: आउट टी में; डेटा: इंटीजर में);
  procedure Op(Obj: in out NT; Data: in Integer);
  overriding    -- overriding indicator
  procedure Op(Obj: in out NT; Data: in String);
  -- ^ compiler issues an error: subprogram "Op" is not overriding


  एनटी प्रकार नया टी शून्य रिकॉर्ड के साथ है;
===C#===
  ओवरराइडिंग - ओवरराइडिंग इंडिकेटर
C # (प्रोग्रामिंग भाषा) पद्धति ओवरराइडिंग का समर्थन करता है, लेकिन केवल यदि संशोधक {{C sharp|override}} और {{C sharp|virtual}} या {{C sharp|abstract}} का उपयोग करके स्पष्ट रूप से इंस्टेंस किया जाता है।
  प्रक्रिया ऑप (ओबीजे: एनटी आउट में; डेटा: इंटीजर में);
  ओवरराइडिंग - ओवरराइडिंग इंडिकेटर
  प्रक्रिया ओप (ओबीजे: एनटी आउट में; डेटा: स्ट्रिंग में);
  -- ^ कंपाइलर एक त्रुटि जारी करता है: उपप्रोग्राम ओप ओवरराइड नहीं कर रहा है
</वाक्यविन्यास हाइलाइट>


===सी#===
  abstract class Animal
सी शार्प (प्रोग्रामिंग लैंग्वेज) | सी # विधि ओवरराइडिंग का समर्थन करता है, लेकिन केवल अगर संशोधक का उपयोग करके स्पष्ट रूप से अनुरोध किया जाता है {{C sharp|override}} और {{C sharp|virtual}} या {{C sharp|abstract}}.


<वाक्यविन्यास प्रकाश लैंग = csharp>
{
सार वर्ग पशु
    public          string Name { get; set; }
{
    // Methods
    सार्वजनिक स्ट्रिंग नाम {प्राप्त करें; तय करना; }
    public          void  Drink();
    // तरीके
    public virtual  void  Eat();
    सार्वजनिक शून्य पेय ();
    public          void  Go();
    सार्वजनिक आभासी शून्य खाओ ();
}
     सार्वजनिक शून्य जाओ ();
}
class Cat : Animal
{
    public new      string Name { get; set; }
    // Methods
    public          void  Drink(); // Warning: hides inherited drink(). Use new
    public override void  Eat();   // Overrides inherited eat().
    public new      void  Go();     // Hides inherited go().
}


वर्ग बिल्ली : पशु
{
    सार्वजनिक नई स्ट्रिंग नाम {प्राप्त करें; तय करना; }
    // तरीके
    सार्वजनिक शून्य पेय (); // चेतावनी: विरासत में मिला पेय () छुपाता है। नया प्रयोग करें
    सार्वजनिक ओवरराइड शून्य खाओ (); // इनहेरिटेड ईट () को ओवरराइड करता है।
    सार्वजनिक नया शून्य जाओ (); // इनहेरिटेड गो () को छुपाता है।
}
</वाक्यविन्यास हाइलाइट>


एक विधि को दूसरे के साथ ओवरराइड करते समय, दो विधियों का प्रकार हस्ताक्षर समान होना चाहिए (और समान दृश्यता के साथ)। सी # में, क्लास विधियों, [[अनुक्रमणिका (प्रोग्रामिंग)]], [[संपत्ति (प्रोग्रामिंग)]] और घटनाओं को ओवरराइड किया जा सकता है।


गैर-आभासी या स्थिर विधियों को ओवरराइड नहीं किया जा सकता है। ओवरराइड की गई आधार विधि आभासी, अमूर्त या ओवरराइड होनी चाहिए।
एक पद्धति को दूसरे के साथ ओवरराइड करते समय, दो पद्धतियों का प्रारूप संकेत समान होना चाहिए (और समान दृश्यता के साथ)। C # में, क्लास पद्धतियों, [[अनुक्रमणिका (प्रोग्रामिंग)]], गुण [[संपत्ति (प्रोग्रामिंग)|(प्रोग्रामिंग)]] और घटनाओं को ओवरराइड किया जा सकता है।


विधि ओवरराइडिंग के लिए उपयोग किए जाने वाले संशोधक के अतिरिक्त, सी # विरासत वाली संपत्ति या विधि के 'छिपाने' की अनुमति देता है। यह एक संपत्ति या विधि के समान हस्ताक्षर का उपयोग करके किया जाता है लेकिन संशोधक को जोड़कर किया जाता है {{C sharp|new}} इसके सामने।<ref>{{cite web
गैर-आभासी या स्थिर पद्धतियों को ओवरराइड नहीं किया जा सकता है। ओवरराइड की गई मूल पद्धति आभासी, अमूर्त या ओवरराइड होनी चाहिए।
 
पद्धति ओवरराइडिंग के लिए उपयोग किए जाने वाले संशोधक के अतिरिक्त, C # इनहेरिटेड गुण या पद्धति के 'छिपाने' की स्वीकृति देता है। यह एक गुण या पद्धति के समान हस्ताक्षर का उपयोग करके किया जाता है लेकिन संशोधक {{C sharp|new}} को जोड़कर किया जाता है।<ref>{{cite web
| accessdate = 2011-08-02
| accessdate = 2011-08-02
| date      = 2002-03-25
| date      = 2002-03-25
Line 59: Line 55:
| url        = http://ssw.jku.at/Teaching/Lectures/CSharp/Tutorial/Part2.pdf}}
| url        = http://ssw.jku.at/Teaching/Lectures/CSharp/Tutorial/Part2.pdf}}
</ref>
</ref>
ऊपर दिए गए उदाहरण में, छिपाने के निम्न कारण होते हैं:
ऊपर दिए गए उदाहरण में, छिपाने के निम्न कारण होते हैं:


<वाक्यविन्यास प्रकाश लैंग = csharp>
Cat cat = new Cat();
बिल्ली बिल्ली = नई बिल्ली ();
 
cat.Name = …;             // accesses Cat.Name
बिल्ली.नाम = …; // Cat.Name तक पहुंचता है
cat.Eat();               // calls Cat.Eat()
बिल्ली खाओ (); // कैट को कॉल करता है। खाओ ()
cat.Go();                 // calls Cat.Go()
बिल्ली.जाओ (); // कॉल कैट। गो ()
((Animal)cat).Name = …;   // accesses Animal.Name!
((पशु) बिल्ली)। नाम = …; // एनिमल तक पहुंचता है। नाम!
((Animal)cat).Eat();     // calls Cat.Eat()!
((पशु) बिल्ली)। खाओ (); // कैट को कॉल करता है। खाओ ()!
((Animal)cat).Go();       // calls Animal.Go()!
((पशु)बिल्ली).जाओ(); // एनिमल को कॉल करता है। गो ()!
</वाक्यविन्यास हाइलाइट>
 
=== [[सी ++]] ===
 
सी ++ में कीवर्ड नहीं है {{Cpp|super}} कि एक उपवर्ग जावा में एक विधि के सुपरक्लास संस्करण को लागू करने के लिए उपयोग कर सकता है जिसे वह ओवरराइड करना चाहता है। इसके बजाय, पैरेंट या बेस क्लास का नाम [[स्कोप रिज़ॉल्यूशन ऑपरेटर]] के बाद प्रयोग किया जाता है। उदाहरण के लिए, निम्न कोड दो वर्ग (कंप्यूटर विज्ञान), आधार वर्ग प्रस्तुत करता है {{Cpp|Rectangle}}, और व्युत्पन्न वर्ग {{Cpp|Box}}. {{Cpp|Box}} ओवरराइड करता है {{Cpp|Rectangle}} कक्षा की {{Cpp|Print}} विधि, ताकि इसकी ऊंचाई को भी प्रिंट किया जा सके।<ref name="malik">Malik 2006, p. 676</ref>
<वाक्यविन्यास लैंग = सीपीपी>
#शामिल <iostream>
 
//------------------------------------------------ ---------------------------
वर्ग आयत {
जनता:
  आयत (डबल एल, डबल डब्ल्यू): लंबाई_(एल), चौड़ाई_(डब्ल्यू) {}
  आभासी शून्य प्रिंट () स्थिरांक;
 
निजी:
  डबल लंबाई_;
  डबल चौड़ाई_;
};
 
//------------------------------------------------ ---------------------------
शून्य आयत :: प्रिंट () कास्ट {
  // बेस क्लास की प्रिंट विधि।
  एसटीडी :: अदालत << लंबाई = << लंबाई_ <<; चौड़ाई = << चौड़ाई_;
}
 
//------------------------------------------------ ---------------------------
वर्ग बॉक्स: सार्वजनिक आयत {
जनता:
  बॉक्स (डबल एल, डबल डब्ल्यू, डबल एच): आयत (एल, डब्ल्यू), ऊंचाई_(एच) {}
  शून्य प्रिंट () कास्ट ओवरराइड;
 
निजी:
  डबल ऊंचाई_;
};


//------------------------------------------------ ---------------------------
=== [[सी ++|C ++]] ===
// व्युत्पन्न वर्ग की प्रिंट विधि।
शून्य बॉक्स :: प्रिंट () कास्ट {
  // पैरेंट प्रिंट विधि को आमंत्रित करें।
  आयत :: प्रिंट ();
  एसटीडी :: अदालत <<; ऊँचाई = << ऊँचाई_;
}
</वाक्यविन्यास हाइलाइट>


प्रक्रिया {{Cpp|Print}} कक्षा में {{Cpp|Box}}विधि के मूल संस्करण को लागू करके {{Cpp|Print}}, निजी [[चर (प्रोग्रामिंग)]] को आउटपुट करने में भी सक्षम है {{Cpp|length}} और {{Cpp|width}} आधार वर्ग का। अन्यथा, इन चरों के लिए पहुंच योग्य नहीं है {{Cpp|Box}}.
C ++ में कीवर्ड {{Cpp|super}} नहीं है कि एक सबक्लास जावा में एक पद्धति के सुपरक्लास संस्करण को प्रयुक्त करने के लिए उपयोग कर सकता है जिसे वह ओवरराइड करना चाहता है। इसके अतिरिक्त, पैरेंट या बेस क्लास का नाम [[स्कोप रिज़ॉल्यूशन ऑपरेटर|स्कोप रिज़ॉल्यूशन संचालक]] के बाद प्रयोग किया जाता है। उदाहरण के लिए, निम्न कोड दो क्लास (कंप्यूटर विज्ञान), बेस क्लास {{Cpp|Rectangle}}, और व्युत्पन्न क्लास {{Cpp|Box}} प्रस्तुत करता है {{Cpp|Box}} {{Cpp|Rectangle}} क्लास के {{Cpp|Print}} पद्धति ओवरराइड करता है ताकि इसकी ऊंचाई को भी प्रिंट किया जा सके।<ref name="malik">Malik 2006, p. 676</ref>
#include <iostream>
//---------------------------------------------------------------------------
class Rectangle {
  public:
  Rectangle(double l, double w) : length_(l), width_(w) {}
  virtual void Print() const;
  private:
  double length_;
  double width_;
};
//---------------------------------------------------------------------------
void Rectangle::Print() const {
  // Print method of base class.
  std::cout << "Length = " << length_ << "; Width = " << width_;
}
//---------------------------------------------------------------------------
class Box : public Rectangle {
  public:
  Box(double l, double w, double h) : Rectangle(l, w), height_(h) {}
  void Print() const override;
  private:
  double height_;
};
//---------------------------------------------------------------------------
// Print method of derived class.
void Box::Print() const {
  // Invoke parent Print method.
  Rectangle::Print();
  std::cout << "; Height = " << height_;
}


निम्नलिखित कथन (प्रोग्रामिंग) वस्तु (कंप्यूटर विज्ञान) प्रकार की वस्तुओं का होगा {{Cpp|Rectangle}} और {{Cpp|Box}}, और उनके संबंधित कॉल करें {{Cpp|Print}} तरीके:


<वाक्यविन्यास लैंग = सीपीपी>
इंट मेन (इंट एआरजीसी, चार ** एआरजीवी) {
  आयत आयत (5.0, 3.0);


  // आउटपुट: लंबाई = 5.0; चौड़ाई = 3.0
प्रक्रिया {{Cpp|Print}} क्लास में {{Cpp|Box}} पद्धति {{Cpp|Print}} के मूल संस्करण को प्रयुक्त करके बेस क्लास निजी [[चर (प्रोग्रामिंग)|वेरिएबल (प्रोग्रामिंग)]] {{Cpp|length}} और {{Cpp|width}} को आउटपुट करने में भी सक्षम है। अन्यथा, ये अस्थायी {{Cpp|Box}} के लिए अनधिगम्य है।
  आयत। प्रिंट ();


  बॉक्स बॉक्स (6.0, 5.0, 4.0);
निम्नलिखित कथन (प्रोग्रामिंग) {{Cpp|Rectangle}} और {{Cpp|Box}} वस्तु (कंप्यूटर विज्ञान) प्रकार की वस्तुओं का होगा और उनके संबंधित {{Cpp|Print}} पद्धतियों को कॉल करेंगे:


  // बॉक्स :: प्रिंट पर vtable में सबसे अधिक ओवरराइड विधि के लिए सूचक,
int main(int argc, char** argv) {
  // लेकिन यह कॉल ओवरराइडिंग का वर्णन नहीं करता है।
  Rectangle rectangle(5.0, 3.0);
  बॉक्स। प्रिंट ();
 
  // Outputs: Length = 5.0; Width = 3.0
  // यह कॉल ओवरराइडिंग दिखाता है।
  rectangle.Print();
  // आउटपुट: लंबाई = 6.0; चौड़ाई = 5.0; ऊँचाई = 4.0
  static_cast <आयत और> (बॉक्स)। प्रिंट ();
  Box box(6.0, 5.0, 4.0);
}
</वाक्यविन्यास हाइलाइट>
  // The pointer to the most overridden method in the vtable in on Box::print,
 
  // but this call does not illustrate overriding.
[[C++11]] में, Java के समान, एक विधि जो घोषित की जाती है <code>final</code> सुपर क्लास में ओवरराइड नहीं किया जा सकता है; साथ ही, एक विधि घोषित की जा सकती है <code>override</code> कंपाइलर को यह जांचने के लिए कि यह बेस क्लास में एक विधि को ओवरराइड करता है।
  box.Print();
  // This call illustrates overriding.
  // outputs: Length = 6.0; Width = 5.0; Height= 4.0
  static_cast<Rectangle&>(box).Print();
}
[[C++11]] में, जावा के समान, सुपर क्लास में <code>final</code> घोषित की गई पद्धति को ओवरराइड नहीं किया जा सकता है; साथ ही, एक पद्धति को ओवरराइड घोषित किया जा सकता है ताकि संकलक अवलोकन कर सके कि यह बेस क्लास में पद्धति को ओवरराइड करता है।


=== डेल्फी ===
=== डेल्फी ===
[[डेल्फी (प्रोग्रामिंग भाषा)]] में, मेथड ओवरराइडिंग डायरेक्टिव ओवरराइड के साथ की जाती है, लेकिन केवल तभी जब किसी मेथड को डायनामिक या वर्चुअल डायरेक्टिव्स के साथ चिह्नित किया गया हो।
[[डेल्फी (प्रोग्रामिंग भाषा)]] में, प्रणाली ओवरराइडिंग निर्देशित ओवरराइड के साथ की जाती है, लेकिन केवल तभी जब किसी प्रणाली को गतिशील या आभासी निर्देश के साथ चिह्नित किया गया हो।


जब आप सुपर-क्लास व्यवहार को कॉल करना चाहते हैं तो इनहेरिट किए गए आरक्षित शब्द को कॉल किया जाना चाहिए
जब आप सुपर-क्लास गतिपद्धति को कॉल करना चाहते हैं तो इनहेरिट किए गए आरक्षित शब्द को कॉल किया जाना चाहिए।


<वाक्यविन्यास लैंग = पास्कल>
type
प्रकार
  TRectangle = class
  आयत = वर्ग
  private
  निजी
    FLength: Double;
    लंबाई: दोहरा;
    FWidth: Double;
    एफविड्थ: डबल;
  public
  जनता
    property Length read FLength write FLength;
    गुण लंबाई पढ़ें लंबाई लिखें लंबाई लिखें;
    property Width read FWidth write FWidth;
    गुण चौड़ाई पढ़ें FWidth लिखें FWidth;
    procedure Print; virtual;
  end;
  TBox = class(TRectangle)
  public
    procedure Print; override;
  end;


    प्रक्रिया प्रिंट; आभासी;
=== एफिल ===
  अंत;
 
  TBox = वर्ग (TRectangle)
  जनता
    प्रक्रिया प्रिंट; ओवरराइड;
  अंत;
</वाक्यविन्यास हाइलाइट>


=== एफिल ===
एफिल (प्रोग्रामिंग भाषा) में, वेरिएबल (विशेषता) पुनर्परिभाषा C++ और जावा में ओवरराइडिंग पद्धति के अनुरूप है। पुनर्वितरण पुनर्वितरण के रूप में वर्गीकृत सुविधा अनुकूलन के तीन रूपों में से एक है। पुनर्घोषणा में प्रभावकारी भी सम्मिलित है, जिसमें एक विशेषता के लिए एक कार्यान्वयन प्रदान किया जाता है जो बेस क्लास में स्थगित (अमूर्त) था, और अपरिभाषित, जिसमें एक विशेषता जो मूल में प्रभावी (मूर्त) थी, एर क्लास में पुनः स्थगित हो जाती है। जब किसी वेरिएबल को पुनः परिभाषित किया जाता है, तो वेरिएबल का नाम एर क्लास द्वारा रखा जाता है, लेकिन वेरिएबल के गुण जैसे कि इसके हस्ताक्षर, अनुबंध (पूर्व शर्त और [[शर्त लगाना|शर्त]]  के लिए प्रतिबंधों का सम्मान), और/या कार्यान्वयन एर में अलग होंगे। यदि बेस क्लास में मूल विशेषता, जिसे एर वेरिएबल का प्रीकर्सर प्रभावी है, तो एर में पुनर्परिभाषित विशेषता प्रभावी होगी। यदि पूर्ववर्ती को स्थगित कर दिया गया है, तो एर में विशेषता को स्थगित कर दिया जाएगा।<ref name="meyer">Meyer 2009, page 572-575</ref>


एफिल (प्रोग्रामिंग लैंग्वेज) में, फीचर रिडेफिनिशन सी ++ और जावा में ओवरराइडिंग विधि के अनुरूप है। पुनर्वितरण पुनर्वितरण के रूप में वर्गीकृत सुविधा अनुकूलन के तीन रूपों में से एक है। पुनर्घोषणा में प्रभावकारी भी शामिल है, जिसमें एक विशेषता के लिए एक कार्यान्वयन प्रदान किया जाता है जो मूल वर्ग में स्थगित (सार) था, और अपरिभाषित, जिसमें एक विशेषता जो माता-पिता में प्रभावी (ठोस) थी, वारिस वर्ग में फिर से स्थगित हो जाती है। जब किसी फीचर को फिर से परिभाषित किया जाता है, तो फीचर का नाम उत्तराधिकारी वर्ग द्वारा रखा जाता है, लेकिन फीचर के गुण जैसे कि इसके हस्ताक्षर, अनुबंध (पूर्व शर्त और [[शर्त लगाना]] के लिए प्रतिबंधों का सम्मान), और/या कार्यान्वयन वारिस में अलग होंगे। यदि पैतृक वर्ग में मूल विशेषता, जिसे उत्तराधिकारी सुविधा का अग्रदूत कहा जाता है, प्रभावी है, तो वारिस में पुनर्परिभाषित विशेषता प्रभावी होगी। यदि पूर्ववर्ती को स्थगित कर दिया गया है, तो वारिस में विशेषता को स्थगित कर दिया जाएगा।<ref name="meyer">Meyer 2009, page 572-575</ref>
वेरिएबल को पुनः परिभाषित करने के विचार मे, नीचे दिए गए उदाहरण में {{Eiffel|message}} के रूप में, स्पष्ट रूप से एर क्लास {{Eiffel|inherit}} वेरिएबल में घोषित किया जाना चाहिए।
एक सुविधा को फिर से परिभाषित करने का इरादा, जैसा कि {{Eiffel|message}} नीचे दिए गए उदाहरण में, स्पष्ट रूप से घोषित किया जाना चाहिए {{Eiffel|inherit}} उत्तराधिकारी वर्ग का खंड।
class
    THOUGHT
feature
    message
            -- Display thought message
        do
            print ("I feel like I am diagonally parked in a parallel universe.%N")
        end
end
class
    ADVICE
inherit
    THOUGHT
        redefine
            message
        end
feature
    message
            -- Precursor
        do
            print ("Warning: Dates in calendar are closer than they appear.%N")
        end
end


<वाक्यविन्यास लैंग = एफिल>
कक्षा
    विचार
विशेषता
    संदेश
            - विचार संदेश प्रदर्शित करें
        करना
            प्रिंट करें (मुझे लगता है कि मैं समानांतर ब्रह्मांड में तिरछे पार्क कर रहा हूं।% N)
        अंत
अंत


कक्षा
    सलाह
इनहेरिट
    विचार
        फिर से परिभाषित
            संदेश
        अंत
विशेषता
    संदेश
            -- अग्रदूत
        करना
            प्रिंट (चेतावनी: कैलेंडर में तिथियां दिखाई देने की तुलना में करीब हैं।%N)
        अंत
अंत
</वाक्यविन्यास हाइलाइट>


कक्षा में {{Eiffel|ADVICE}} विशेषता {{Eiffel|message}} एक कार्यान्वयन दिया जाता है जो कक्षा में इसके अग्रदूत से भिन्न होता है {{Eiffel|THOUGHT}}.
क्लास में {{Eiffel|ADVICE}} विशेषता {{Eiffel|message}} कार्यान्वयन दिया जाता है जो क्लास {{Eiffel|THOUGHT}} में इसके प्रीकर्सर से भिन्न होता है


एक वर्ग पर विचार करें जो दोनों के लिए उदाहरणों का उपयोग करता है {{Eiffel|THOUGHT}} और {{Eiffel|ADVICE}}:
क्लास पर विचार करें जो {{Eiffel|THOUGHT}} और {{Eiffel|ADVICE}} दोनों के लिए उदाहरणों का उपयोग करता है:


<वाक्यविन्यास लैंग = एफिल>
class
कक्षा
    APPLICATION
    आवेदन
create
बनाएं
    make
    निर्माण
feature
विशेषता
    make
    निर्माण
            -- Run application.
            - एप्लिकेशन चलाएँ।
        do
        करना
            (create {THOUGHT}).message;
            ({विचार} बनाएं)। संदेश;
            (create {ADVICE}).message
            ({सलाह} बनाएं)। संदेश
        end
        अंत
end
अंत
</वाक्यविन्यास हाइलाइट>


जब तत्काल, class {{Eiffel|APPLICATION}} निम्नलिखित आउटपुट उत्पन्न करता है:
जब तत्काल, क्लास {{Eiffel|APPLICATION}} निम्नलिखित आउटपुट उत्पन्न करता है:
I feel like I am diagonally parked in a parallel universe.
Warning: Dates in calendar are closer than they appear.
एक पुनर्परिभाषित सुविधा के अंदर, भाषा कीवर्ड {{Eiffel|Precursor}} का उपयोग करके सुविधा के प्रीकर्सर तक अभिगम्य प्राप्त की जा सकती है, {{Eiffel|{ADVICE}.message}} के कार्यान्वयन पर विचार करें निम्नानुसार परिवर्तित किया जाता है:


<वाक्यविन्यास प्रकाश लैंग = आउटपुट>
  message
मुझे ऐसा लगता है कि मैं तिरछे समानांतर ब्रह्मांड में खड़ा हूं।
            -- Precursor
चेतावनी: कैलेंडर में दिनांक दिखाई देने की तुलना में निकट हैं।
        do
</वाक्यविन्यास हाइलाइट>
            print ("Warning: Dates in calendar are closer than they appear.%N")
            Precursor
        end


एक पुनर्परिभाषित सुविधा के भीतर, भाषा कीवर्ड का उपयोग करके सुविधा के अग्रदूत तक पहुंच प्राप्त की जा सकती है {{Eiffel|Precursor}}. के कार्यान्वयन पर विचार करें {{Eiffel|{ADVICE}.message}} निम्नानुसार बदला जाता है:
सुविधा के इंस्टेंस में {{Eiffel|{THOUGHT}.message}} का निष्पादन सम्मिलित है, और निम्न आउटपुट उत्पन्न करता है:
Warning: Dates in calendar are closer than they appear.
I feel like I am diagonally parked in a parallel universe.


<वाक्यविन्यास लैंग = एफिल>
=== जावा ===
    संदेश
[[जावा (प्रोग्रामिंग भाषा)]] में, जब सबक्लास में एक पद्धति होती है जो सुपरक्लास की पद्धति को ओवरराइड करती है, तो यह [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)]] {{Java|super}}का उपयोग करके सुपरक्लास पद्धति को भी प्रयुक्त कर सकती है।<ref name="lewis-loftus" /> उदाहरण:
            -- अग्रदूत
        करना
            प्रिंट (चेतावनी: कैलेंडर में तिथियां दिखाई देने की तुलना में करीब हैं।%N)
            अग्रगामी
        अंत
</वाक्यविन्यास हाइलाइट>


सुविधा के आह्वान में अब का निष्पादन शामिल है {{Eiffel|{THOUGHT}.message}}, और निम्न आउटपुट उत्पन्न करता है:
    public void message() {
        System.out.println("I feel like I am diagonally parked in a parallel universe.");
    }
}
public class Advice extends Thought {
    @Override  // @Override annotation in Java 5 is optional but helpful.
    public void message() {
        System.out.println("Warning: Dates in calendar are closer than they appear.");
    } 


<वाक्यविन्यास प्रकाश लैंग = आउटपुट>
चेतावनी: कैलेंडर में दिनांक दिखाई देने की तुलना में निकट हैं।
मुझे ऐसा लगता है कि मैं तिरछे समानांतर ब्रह्मांड में खड़ा हूं।
</वाक्यविन्यास हाइलाइट>


=== जावा ===
[[जावा (प्रोग्रामिंग भाषा)]] में, जब एक उपवर्ग में एक विधि होती है जो सुपरक्लास की एक विधि को ओवरराइड करती है, तो यह [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)]] का उपयोग करके सुपरक्लास विधि को भी लागू कर सकती है। {{Java|super}}.<ref name="lewis-loftus" />उदाहरण:


<वाक्यविन्यास प्रकाश लैंग = जावा>
क्लास {{Java|Thought}} सुपरक्लास का प्रतिनिधित्व करता है और एक पद्धति कॉल {{Java|message()}}प्रयुक्त करता है। {{Java|Advice}}नामक सबक्लास प्रत्येक उस पद्धति को इनहेरिट करता है जो {{Java|Thought}} क्लास में हो सकती है। हालाँकि, क्लास {{Java|Advice}} पद्धति {{Java|message()}}को ओवरराइड करता है, इसकी कार्यक्षमता को {{Java|Thought}} से परिवर्तित कर देता है।
वर्ग विचार {
    सार्वजनिक शून्य संदेश () {
        System.out.println (मुझे लगता है कि मैं समानांतर ब्रह्मांड में तिरछे पार्क कर रहा हूं।);
    }
}


सार्वजनिक वर्ग सलाह विचार का विस्तार करती है {
Thought parking = new Thought();
    @Override // जावा 5 में @Override एनोटेशन वैकल्पिक है लेकिन सहायक है।
parking.message();  // Prints "I feel like I am diagonally parked in a parallel universe."
    सार्वजनिक शून्य संदेश () {
        System.out.println (चेतावनी: कैलेंडर में तिथियां दिखाई देने की तुलना में करीब हैं।);
Thought dates = new Advice();  // Polymorphism
    }
dates.message();  // Prints "Warning: Dates in calendar are closer than they appear."
}
<code>super</code> संदर्भ हो सकता है
</वाक्यविन्यास हाइलाइट>
public class Advice extends Thought {
      @Override
      public void message() {
          System.out.println("Warning: Dates in calendar are closer than they appear.");
          super.message();  // Invoke parent's version of method. 


कक्षा {{Java|Thought}} सुपरक्लास का प्रतिनिधित्व करता है और एक विधि कॉल लागू करता है {{Java|message()}}. उपवर्ग कहा जाता है {{Java|Advice}} में हो सकने वाली हर विधि को इनहेरिट करता है {{Java|Thought}} कक्षा। हालाँकि, वर्ग {{Java|Advice}} विधि को ओवरराइड करता है {{Java|message()}}, इसकी कार्यक्षमता को से बदल रहा है {{Java|Thought}}.


<वाक्यविन्यास प्रकाश लैंग = जावा>
सोचा पार्किंग = नया सोचा ();
पार्किंग संदेश (); // प्रिंट मुझे लगता है जैसे मैं समानांतर ब्रह्मांड में तिरछे पार्क कर रहा हूं।


विचार दिनांक = नई सलाह (); // बहुरूपता
ऐसी पद्धतियाँ हैं जो सबक्लास ओवरराइड नहीं कर सकते हैं। उदाहरण के लिए, जावा में, सुपर क्लास में अंतिम घोषित की गई पद्धति को ओवरराइड नहीं किया जा सकता है। जिन तरीकों को निजी या स्थिर घोषित किया गया है, उन्हें ओवरराइड नहीं किया जा सकता क्योंकि वे पूरी तरह से अंतिम हैं। एक क्लास के लिए यह भी असंभव है कि सुपर क्लास बनने के लिए अंतिम घोषित किया जाए।<ref name="deitel">Deitel & Deitel 2001, p.474</ref>
दिनांक संदेश (); // प्रिंट चेतावनी: कैलेंडर में तिथियां दिखाई देने की तुलना में करीब हैं।
</वाक्यविन्यास हाइलाइट> {{Java|super}} }} संदर्भ हो सकता है
<वाक्यविन्यास प्रकाश लैंग = जावा>
सार्वजनिक वर्ग सलाह विचार का विस्तार करती है {
      @Override
      सार्वजनिक शून्य संदेश () {
          System.out.println (चेतावनी: कैलेंडर में तिथियां दिखाई देने की तुलना में करीब हैं।);
          सुपर संदेश (); // माता-पिता के विधि के संस्करण को आमंत्रित करें।
      }
</वाक्यविन्यास हाइलाइट>


ऐसी विधियाँ हैं जो उपवर्ग ओवरराइड नहीं कर सकते हैं। उदाहरण के लिए, जावा में, सुपर क्लास में अंतिम घोषित की गई विधि को ओवरराइड नहीं किया जा सकता है। जिन तरीकों को निजी या स्थैतिक घोषित किया गया है, उन्हें ओवरराइड नहीं किया जा सकता क्योंकि वे पूरी तरह से अंतिम हैं। एक वर्ग के लिए यह भी असंभव है कि सुपर क्लास बनने के लिए अंतिम घोषित किया जाए।<ref name="deitel">Deitel & Deitel 2001, p.474</ref>




=== कोटलिन ===
=== कोटलिन ===
[[कोटलिन (प्रोग्रामिंग भाषा)]] में हम इस तरह से एक फ़ंक्शन को ओवरराइड कर सकते हैं (ध्यान दें कि फ़ंक्शन होना चाहिए {{java|open}}):
[[कोटलिन (प्रोग्रामिंग भाषा)]] में हम इस तरह से एक फ़ंक्शन को ओवरराइड कर सकते हैं (ध्यान दें कि फ़ंक्शन {{java|open}} होना चाहिए):


<वाक्यविन्यास लैंग = कोटलिन>
  fun main() {
मज़ा मुख्य () {
    वैल पी = माता पिता (5)
    वैल सी = बच्चा (6)
    p.myFun()
    सी.मायफन ()
}


ओपन क्लास पैरेंट (वैल ए: इंट) {
    val p = Parent(5)
    खुला मज़ा myFun () = Println ()
    val c = Child(6)
}
    p.myFun()
    c.myFun()
}
open class Parent(val a : Int) {
    open fun myFun() = println(a)
}
class Child(val b : Int) : Parent(b) {
    override fun myFun() = println("overrided method")
}


क्लास चाइल्ड (वैलिड बी: इंट): पैरेंट (बी) {
===पायथन===
    ओवरराइड fun myFun() = Println (ओवरराइड विधि)
पायथन (प्रोग्रामिंग भाषा) में, जब एक सबक्लास में एक पद्धति होती है जो सुपरक्लास की एक पद्धति को ओवरराइड करती है, तो आप स्वयं पद्धति के अतिरिक्त सुपर {{Python|super(Subclass, self).method}}<ref name="python-3-super">{{Python|super().method}} in Python 3 - see https://docs.python.org/3/library/functions.html#super {{Webarchive|url=https://web.archive.org/web/20181026035007/https://docs.python.org/3/library/functions.html#super |date=2018-10-26 }}</ref> को कॉल करके {{Python|self.method}} को भी कॉल कर सकते है।
}
</वाक्यविन्यास हाइलाइट>


===पायथन===
पायथन (प्रोग्रामिंग लैंग्वेज) में, जब एक उपवर्ग में एक विधि होती है जो सुपरक्लास की एक विधि को ओवरराइड करती है, तो आप सुपरक्लास विधि को कॉल करके भी कॉल कर सकते हैं {{Python|super(Subclass, self).method}}<ref name="python-3-super">{{Python|super().method}} in Python 3 - see https://docs.python.org/3/library/functions.html#super {{Webarchive|url=https://web.archive.org/web/20181026035007/https://docs.python.org/3/library/functions.html#super |date=2018-10-26 }}</ref> के बजाय {{Python|self.method}}.
उदाहरण:
उदाहरण:
  class Thought:


<वाक्यविन्यास लैंग = अजगर>
    def __init__(self) -> None:
वर्ग विचार:
        print("I'm a new object of type Thought!")
    def __init__(self) -> कोई नहीं:
    def message(self) -> None:
        प्रिंट (मैं सोचा प्रकार की एक नई वस्तु हूँ!)
        print("I feel like I am diagonally parked in a parallel universe.")
    def संदेश (स्वयं) -> कोई नहीं:
        प्रिंट (मुझे लगता है कि मैं समानांतर ब्रह्मांड में तिरछे खड़ा हूं।)
class Advice(Thought):
 
    def __init__(self) -> None:
वर्ग सलाह (विचार):
        super(Advice, self).__init__()
    def __init__(self) -> कोई नहीं:
    def message(self) -> None:
        सुपर (सलाह, स्वयं) .__init__()
        print("Warning: Dates in calendar are closer than they appear")
    def संदेश (स्वयं) -> कोई नहीं:
        super(Advice, self).message()
        प्रिंट (चेतावनी: कैलेंडर में तिथियां दिखाई देने की तुलना में करीब हैं)
        सुपर (सलाह, स्वयं)। संदेश ()
t = Thought()
 
# "I'm a new object of type Thought!"
टी = सोचा ()
t.message()
# मैं टाइप थॉट की एक नई वस्तु हूँ!
# "I feel like I am diagonally parked in a parallel universe.
टी.संदेश ()
# मुझे ऐसा लगता है कि मैं समानांतर ब्रह्मांड में तिरछे खड़ा हूं।
a = Advice()
 
# "I'm a new object of type Thought!"
= सलाह ()
a.message()
# मैं टाइप थॉट की एक नई वस्तु हूँ!
# "Warning: Dates in calendar are closer than they appear"
एक संदेश()
# "I feel like I am diagonally parked in a parallel universe.
# चेतावनी: कैलेंडर में तारीखें दिखाई देने की तुलना में करीब हैं
# मुझे ऐसा लगता है कि मैं समानांतर ब्रह्मांड में तिरछे खड़ा हूं।
# ------------------
 
# Introspection:
# ------------------
#आत्मनिरीक्षण:
isinstance(t, Thought)
 
# True
उदाहरण (टी, विचार)
# सत्य
isinstance(a, Advice)
# True
isinstance(a, Thought)
# True


उदाहरण (, सलाह)
isinstance(a, Advice)
# सत्य
# True
 
उदाहरण (ए, विचार)
# सत्य
</वाक्यविन्यास हाइलाइट>


=== रूबी ===
=== रूबी ===
[[रूबी (प्रोग्रामिंग भाषा)]] में जब एक उपवर्ग में एक विधि होती है जो सुपरक्लास की एक विधि को ओवरराइड करती है, तो आप उस ओवरराइड विधि में सुपर को कॉल करके सुपरक्लास विधि को भी कॉल कर सकते हैं। आप उपनाम का उपयोग कर सकते हैं यदि आप ओवरराइडिंग विधि को ओवरराइडिंग विधि के बाहर उपलब्ध रखना चाहते हैं जैसा कि नीचे 'super_message' के साथ दिखाया गया है।
[[रूबी (प्रोग्रामिंग भाषा)]] में जब एक सबक्लास में एक पद्धति होती है जो सुपरक्लास की एक पद्धति को ओवरराइड करती है, तो आप उस ओवरराइड पद्धति में सुपर को कॉल करके सुपरक्लास पद्धति को भी कॉल कर सकते हैं। आप उपनाम का उपयोग कर सकते हैं यदि आप ओवरराइडिंग पद्धति को ओवरराइडिंग पद्धति के बाहर उपलब्ध रखना चाहते हैं जैसा कि नीचे <nowiki>''सुपर_मैसेज''</nowiki> के साथ दिखाया गया है।


उदाहरण:
उदाहरण:


<वाक्यविन्यास लैंग = रूबी>
class Thought
वर्ग विचार
  def message
  डीईएफ़ संदेश
    puts "I feel like I am diagonally parked in a parallel universe."
    पुट मुझे ऐसा महसूस होता है कि मैं समानांतर ब्रह्मांड में तिरछे खड़ा हूं।
  end
  अंत
end
अंत
 
class Advice < Thought
वर्ग सलाह <विचार
  alias :super_message :message
  उर्फ :super_message :message
  def message
  डीईएफ़ संदेश
    puts "Warning: Dates in calendar are closer than they appear"
    चेतावनी देता है: कैलेंडर में तारीखें दिखाई देने की तुलना में करीब हैं
    super
    बहुत अच्छा
  end
  अंत
end
अंत
</वाक्यविन्यास हाइलाइट>


==टिप्पणियाँ==
==टिप्पणियाँ==
Line 366: Line 341:


== यह भी देखें ==
== यह भी देखें ==
* [[कार्यान्वयन विरासत]]
* [[कार्यान्वयन विरासत|कार्यान्वयन इनहेरिटेंस]]
* [[वंशानुक्रम शब्दार्थ]]
* [[वंशानुक्रम शब्दार्थ|इनहेरिटेंस शब्दार्थ]]
* [[विधि अधिभार]]
* [[विधि अधिभार|पद्धति अधिभार]]
* [[वस्तु-उन्मुख प्रोग्रामिंग में बहुरूपता]]
* [[वस्तु-उन्मुख प्रोग्रामिंग में बहुरूपता]]
* [[टेम्पलेट विधि पैटर्न]]
* [[टेम्पलेट विधि पैटर्न|टेम्पलेट पद्धति पैटर्न]]
* [[आभासी विरासत]]
* [[आभासी विरासत|आभासी इनहेरिटेंस]]
* एचटीटीपी हेडर फ़ील्ड की सूची#सामान्य गैर-मानक अनुरोध फ़ील्ड|X-HTTP-Method-Override HTTP हैडर
* एचटीटीपी हेडर क्षेत्र की सूची


==संदर्भ==
==संदर्भ==
Line 387: Line 362:


{{DEFAULTSORT:Method Overriding}}
{{DEFAULTSORT:Method Overriding}}
<!--Categories-->[[Category: C++ कोड उदाहरण के साथ लेख]] [[Category: उदाहरण कोड वाले लेख]] [[Category: जावा कोड उदाहरण के साथ लेख]] [[Category: विधि (कंप्यूटर प्रोग्रामिंग)]]
<!--Categories-->
 
 


[[Category: Machine Translated Page]]
[[Category:Articles with example C Sharp code|Method Overriding]]
[[Category:Created On 16/02/2023]]
[[Category:Articles with example Java code|Method Overriding]]
[[Category:C++ कोड उदाहरण के साथ लेख|Method Overriding]]
[[Category:Created On 16/02/2023|Method Overriding]]
[[Category:Lua-based templates|Method Overriding]]
[[Category:Machine Translated Page|Method Overriding]]
[[Category:Pages with script errors|Method Overriding]]
[[Category:Short description with empty Wikidata description|Method Overriding]]
[[Category:Templates Vigyan Ready|Method Overriding]]
[[Category:Templates that add a tracking category|Method Overriding]]
[[Category:Templates that generate short descriptions|Method Overriding]]
[[Category:Templates using TemplateData|Method Overriding]]
[[Category:Webarchive template wayback links]]
[[Category:उदाहरण कोड वाले लेख|Method Overriding]]
[[Category:जावा कोड उदाहरण के साथ लेख|Method Overriding]]
[[Category:विधि (कंप्यूटर प्रोग्रामिंग)|Method Overriding]]

Latest revision as of 10:37, 24 February 2023

चित्रण

वस्तु उन्मुख प्रोग्रामिंग में पद्धति ओवरराइडिंग, एक भाषा सुविधा है जो एक सबक्लास (कंप्यूटर विज्ञान) या चाइल्ड क्लास को एक पद्धति (कंप्यूटर विज्ञान) का एक विशिष्ट कार्यान्वयन प्रदान करने की स्वीकृति देता है जो पहले से ही इसके सुपरक्लास (कंप्यूटर विज्ञान) या पेरेंट क्लास मे से एक द्वारा प्रदान किया गया है। वर्चुअल नेटवर्क इंटरफेस में डेटा-संचालित एल्गोरिथम-निर्धारित पैरामीटर (मानदंड) प्रदान करने के अतिरिक्त,[1] यह एक विशिष्ट प्रकार के बहुरूपता (सबटाइपिंग) की भी स्वीकृति देता है। सबक्लास में कार्यान्वयन सुपरक्लास में कार्यान्वयन को एक पद्धति प्रदान करके ओवरराइड (प्रतिस्थापित) करता है जिसमें समान नाम, समान पैरामीटर (कंप्यूटर विज्ञान) या हस्ताक्षर, और बेस क्लास में पद्धति के समान निर्वाचित प्रकार होता है।[2] निष्पादित की जाने वाली पद्धति का संस्करण उस वस्तु (कंप्यूटर विज्ञान) द्वारा निर्धारित किया जाएगा जिसका उपयोग इसे प्रयुक्त करने के लिए किया जाता है। यदि पैरेंट क्लास के किसी वस्तु का उपयोग पद्धति को प्रयुक्त करने के लिए किया जाता है, तो पैरेंट क्लास में संस्करण को निष्पादित किया जाएगा, लेकिन यदि सबक्लास के किसी वस्तु का उपयोग पद्धति को प्रयुक्त करने के लिए किया जाता है, तो चाइल्ड क्लास में संस्करण निष्पादित किया जाएगा।[3] यह विभेदक प्रसारण विश्लेषक से जुड़ी समस्याओं को रोकने में सहायता करता है जो अन्यथा एक रूपरेखा पर निर्भर करती हैं जिसमें पद्धति ओवरराइडिंग को कम किया जा सकता है।[4][5] कुछ भाषाएँ प्रोग्रामर को किसी पद्धति को ओवरराइड होने से रोकने की स्वीकृति देती हैं।

भाषा-विशिष्ट उदाहरण

एडीए

एडीए (प्रोग्रामिंग भाषा) डिफ़ॉल्ट रूप से ओवरराइडिंग पद्धति प्रदान करती है। प्रारम्भिक त्रुटि का पता लगाने के पक्ष में (उदाहरण के लिए एक गलत वर्तनी), यह निर्दिष्ट करना संभव है कि किस पद्धति के वास्तव में ओवरराइडिंग होने की अपेक्षा है, या नहीं। वह संकलक द्वारा जाँच की जाएगी।

 type T is new Controlled with ......;
  procedure Op(Obj: in out T; Data: in Integer);

  type NT is new T with null record;
  overriding    -- overriding indicator
  procedure Op(Obj: in out NT; Data: in Integer);
  overriding    -- overriding indicator
  procedure Op(Obj: in out NT; Data: in String);
  -- ^ compiler issues an error: subprogram "Op" is not overriding

C#

C # (प्रोग्रामिंग भाषा) पद्धति ओवरराइडिंग का समर्थन करता है, लेकिन केवल यदि संशोधक override और virtual या abstract का उपयोग करके स्पष्ट रूप से इंस्टेंस किया जाता है।

 abstract class Animal
{
    public          string Name { get; set; }
    // Methods
    public          void   Drink();
    public virtual  void   Eat();
    public          void   Go();
}

class Cat : Animal
{
    public new      string Name { get; set; }
    // Methods
    public          void   Drink();  // Warning: hides inherited drink(). Use new
    public override void   Eat();    // Overrides inherited eat().
    public new      void   Go();     // Hides inherited go().
}


एक पद्धति को दूसरे के साथ ओवरराइड करते समय, दो पद्धतियों का प्रारूप संकेत समान होना चाहिए (और समान दृश्यता के साथ)। C # में, क्लास पद्धतियों, अनुक्रमणिका (प्रोग्रामिंग), गुण (प्रोग्रामिंग) और घटनाओं को ओवरराइड किया जा सकता है।

गैर-आभासी या स्थिर पद्धतियों को ओवरराइड नहीं किया जा सकता है। ओवरराइड की गई मूल पद्धति आभासी, अमूर्त या ओवरराइड होनी चाहिए।

पद्धति ओवरराइडिंग के लिए उपयोग किए जाने वाले संशोधक के अतिरिक्त, C # इनहेरिटेड गुण या पद्धति के 'छिपाने' की स्वीकृति देता है। यह एक गुण या पद्धति के समान हस्ताक्षर का उपयोग करके किया जाता है लेकिन संशोधक new को जोड़कर किया जाता है।[6]

ऊपर दिए गए उदाहरण में, छिपाने के निम्न कारण होते हैं:

Cat cat = new Cat();

cat.Name = …;             // accesses Cat.Name
cat.Eat();                // calls Cat.Eat()
cat.Go();                 // calls Cat.Go()
((Animal)cat).Name = …;   // accesses Animal.Name!
((Animal)cat).Eat();      // calls Cat.Eat()!
((Animal)cat).Go();       // calls Animal.Go()!

C ++

C ++ में कीवर्ड super नहीं है कि एक सबक्लास जावा में एक पद्धति के सुपरक्लास संस्करण को प्रयुक्त करने के लिए उपयोग कर सकता है जिसे वह ओवरराइड करना चाहता है। इसके अतिरिक्त, पैरेंट या बेस क्लास का नाम स्कोप रिज़ॉल्यूशन संचालक के बाद प्रयोग किया जाता है। उदाहरण के लिए, निम्न कोड दो क्लास (कंप्यूटर विज्ञान), बेस क्लास Rectangle, और व्युत्पन्न क्लास Box प्रस्तुत करता है Box Rectangle क्लास के Print पद्धति ओवरराइड करता है ताकि इसकी ऊंचाई को भी प्रिंट किया जा सके।[7]

#include <iostream>

//---------------------------------------------------------------------------
class Rectangle {
 public:
  Rectangle(double l, double w) : length_(l), width_(w) {}
  virtual void Print() const;

 private:
  double length_;
  double width_;
};

//---------------------------------------------------------------------------
void Rectangle::Print() const {
  // Print method of base class.
  std::cout << "Length = " << length_ << "; Width = " << width_;
}

//---------------------------------------------------------------------------
class Box : public Rectangle {
 public:
  Box(double l, double w, double h) : Rectangle(l, w), height_(h) {}
  void Print() const override;

 private:
  double height_;
};

//---------------------------------------------------------------------------
// Print method of derived class.
void Box::Print() const {
  // Invoke parent Print method.
  Rectangle::Print();
  std::cout << "; Height = " << height_;
}


प्रक्रिया Print क्लास में Box पद्धति Print के मूल संस्करण को प्रयुक्त करके बेस क्लास निजी वेरिएबल (प्रोग्रामिंग) length और width को आउटपुट करने में भी सक्षम है। अन्यथा, ये अस्थायी Box के लिए अनधिगम्य है।

निम्नलिखित कथन (प्रोग्रामिंग) Rectangle और Box वस्तु (कंप्यूटर विज्ञान) प्रकार की वस्तुओं का होगा और उनके संबंधित Print पद्धतियों को कॉल करेंगे:

int main(int argc, char** argv) {
  Rectangle rectangle(5.0, 3.0);

  // Outputs: Length = 5.0; Width = 3.0
  rectangle.Print();

  Box box(6.0, 5.0, 4.0);

  // The pointer to the most overridden method in the vtable in on Box::print,
  // but this call does not illustrate overriding.
  box.Print();

  // This call illustrates overriding.
  // outputs: Length = 6.0; Width = 5.0; Height= 4.0
  static_cast<Rectangle&>(box).Print();
}

C++11 में, जावा के समान, सुपर क्लास में final घोषित की गई पद्धति को ओवरराइड नहीं किया जा सकता है; साथ ही, एक पद्धति को ओवरराइड घोषित किया जा सकता है ताकि संकलक अवलोकन कर सके कि यह बेस क्लास में पद्धति को ओवरराइड करता है।

डेल्फी

डेल्फी (प्रोग्रामिंग भाषा) में, प्रणाली ओवरराइडिंग निर्देशित ओवरराइड के साथ की जाती है, लेकिन केवल तभी जब किसी प्रणाली को गतिशील या आभासी निर्देश के साथ चिह्नित किया गया हो।

जब आप सुपर-क्लास गतिपद्धति को कॉल करना चाहते हैं तो इनहेरिट किए गए आरक्षित शब्द को कॉल किया जाना चाहिए।

type
  TRectangle = class
  private
    FLength: Double;
    FWidth: Double;
  public
    property Length read FLength write FLength;
    property Width read FWidth write FWidth;

    procedure Print; virtual;
  end;

  TBox = class(TRectangle)
  public
    procedure Print; override;
  end;

एफिल

एफिल (प्रोग्रामिंग भाषा) में, वेरिएबल (विशेषता) पुनर्परिभाषा C++ और जावा में ओवरराइडिंग पद्धति के अनुरूप है। पुनर्वितरण पुनर्वितरण के रूप में वर्गीकृत सुविधा अनुकूलन के तीन रूपों में से एक है। पुनर्घोषणा में प्रभावकारी भी सम्मिलित है, जिसमें एक विशेषता के लिए एक कार्यान्वयन प्रदान किया जाता है जो बेस क्लास में स्थगित (अमूर्त) था, और अपरिभाषित, जिसमें एक विशेषता जो मूल में प्रभावी (मूर्त) थी, एर क्लास में पुनः स्थगित हो जाती है। जब किसी वेरिएबल को पुनः परिभाषित किया जाता है, तो वेरिएबल का नाम एर क्लास द्वारा रखा जाता है, लेकिन वेरिएबल के गुण जैसे कि इसके हस्ताक्षर, अनुबंध (पूर्व शर्त और शर्त के लिए प्रतिबंधों का सम्मान), और/या कार्यान्वयन एर में अलग होंगे। यदि बेस क्लास में मूल विशेषता, जिसे एर वेरिएबल का प्रीकर्सर प्रभावी है, तो एर में पुनर्परिभाषित विशेषता प्रभावी होगी। यदि पूर्ववर्ती को स्थगित कर दिया गया है, तो एर में विशेषता को स्थगित कर दिया जाएगा।[8]

वेरिएबल को पुनः परिभाषित करने के विचार मे, नीचे दिए गए उदाहरण में message के रूप में, स्पष्ट रूप से एर क्लास inherit वेरिएबल में घोषित किया जाना चाहिए।

class
    THOUGHT
feature
    message
            -- Display thought message
        do
            print ("I feel like I am diagonally parked in a parallel universe.%N")
        end
end

class
    ADVICE
inherit
    THOUGHT
        redefine
            message
        end
feature
    message
            -- Precursor
        do
            print ("Warning: Dates in calendar are closer than they appear.%N")
        end
end


क्लास में ADVICE विशेषता message कार्यान्वयन दिया जाता है जो क्लास THOUGHT में इसके प्रीकर्सर से भिन्न होता है

क्लास पर विचार करें जो THOUGHT और ADVICE दोनों के लिए उदाहरणों का उपयोग करता है:

class
    APPLICATION
create
    make
feature 
    make
            -- Run application.
        do
            (create {THOUGHT}).message;
            (create {ADVICE}).message
        end
end

जब तत्काल, क्लास APPLICATION निम्नलिखित आउटपुट उत्पन्न करता है:

I feel like I am diagonally parked in a parallel universe.
Warning: Dates in calendar are closer than they appear.

एक पुनर्परिभाषित सुविधा के अंदर, भाषा कीवर्ड Precursor का उपयोग करके सुविधा के प्रीकर्सर तक अभिगम्य प्राप्त की जा सकती है, {ADVICE}.message के कार्यान्वयन पर विचार करें निम्नानुसार परिवर्तित किया जाता है:

 message
            -- Precursor
        do
            print ("Warning: Dates in calendar are closer than they appear.%N")
            Precursor
        end

सुविधा के इंस्टेंस में {THOUGHT}.message का निष्पादन सम्मिलित है, और निम्न आउटपुट उत्पन्न करता है:

Warning: Dates in calendar are closer than they appear.
I feel like I am diagonally parked in a parallel universe.

जावा

जावा (प्रोग्रामिंग भाषा) में, जब सबक्लास में एक पद्धति होती है जो सुपरक्लास की पद्धति को ओवरराइड करती है, तो यह कीवर्ड (कंप्यूटर प्रोग्रामिंग) superका उपयोग करके सुपरक्लास पद्धति को भी प्रयुक्त कर सकती है।[3] उदाहरण:

    public void message() {
        System.out.println("I feel like I am diagonally parked in a parallel universe.");
    }
}

public class Advice extends Thought {
    @Override  // @Override annotation in Java 5 is optional but helpful.
    public void message() {
        System.out.println("Warning: Dates in calendar are closer than they appear.");
    } 


क्लास Thought सुपरक्लास का प्रतिनिधित्व करता है और एक पद्धति कॉल message()प्रयुक्त करता है। Adviceनामक सबक्लास प्रत्येक उस पद्धति को इनहेरिट करता है जो Thought क्लास में हो सकती है। हालाँकि, क्लास Advice पद्धति message()को ओवरराइड करता है, इसकी कार्यक्षमता को Thought से परिवर्तित कर देता है।

Thought parking = new Thought();
parking.message();  // Prints "I feel like I am diagonally parked in a parallel universe."

Thought dates = new Advice();  // Polymorphism
dates.message();  // Prints "Warning: Dates in calendar are closer than they appear."

super संदर्भ हो सकता है

public class Advice extends Thought {
      @Override
      public void message() {
          System.out.println("Warning: Dates in calendar are closer than they appear.");
          super.message();  // Invoke parent's version of method. 


ऐसी पद्धतियाँ हैं जो सबक्लास ओवरराइड नहीं कर सकते हैं। उदाहरण के लिए, जावा में, सुपर क्लास में अंतिम घोषित की गई पद्धति को ओवरराइड नहीं किया जा सकता है। जिन तरीकों को निजी या स्थिर घोषित किया गया है, उन्हें ओवरराइड नहीं किया जा सकता क्योंकि वे पूरी तरह से अंतिम हैं। एक क्लास के लिए यह भी असंभव है कि सुपर क्लास बनने के लिए अंतिम घोषित किया जाए।[9]


कोटलिन

कोटलिन (प्रोग्रामिंग भाषा) में हम इस तरह से एक फ़ंक्शन को ओवरराइड कर सकते हैं (ध्यान दें कि फ़ंक्शन open होना चाहिए):

 fun main() {
    val p = Parent(5)
    val c = Child(6)
    p.myFun()
    c.myFun()
}

open class Parent(val a : Int) {
    open fun myFun() = println(a)
}

class Child(val b : Int) : Parent(b) {
    override fun myFun() = println("overrided method")
}

पायथन

पायथन (प्रोग्रामिंग भाषा) में, जब एक सबक्लास में एक पद्धति होती है जो सुपरक्लास की एक पद्धति को ओवरराइड करती है, तो आप स्वयं पद्धति के अतिरिक्त सुपर super(Subclass, self).method[10] को कॉल करके self.method को भी कॉल कर सकते है।

उदाहरण:

 class Thought:
    def __init__(self) -> None:
        print("I'm a new object of type Thought!")
    def message(self) -> None:
        print("I feel like I am diagonally parked in a parallel universe.")

class Advice(Thought):
    def __init__(self) -> None:
        super(Advice, self).__init__()
    def message(self) -> None:
        print("Warning: Dates in calendar are closer than they appear")
        super(Advice, self).message()

t = Thought()
# "I'm a new object of type Thought!"
t.message()
# "I feel like I am diagonally parked in a parallel universe.

a = Advice()
# "I'm a new object of type Thought!"
a.message()
# "Warning: Dates in calendar are closer than they appear"
# "I feel like I am diagonally parked in a parallel universe.

# ------------------
# Introspection:

isinstance(t, Thought)
# True

isinstance(a, Advice)
# True

isinstance(a, Thought)
# True
isinstance(a, Advice)
# True

रूबी

रूबी (प्रोग्रामिंग भाषा) में जब एक सबक्लास में एक पद्धति होती है जो सुपरक्लास की एक पद्धति को ओवरराइड करती है, तो आप उस ओवरराइड पद्धति में सुपर को कॉल करके सुपरक्लास पद्धति को भी कॉल कर सकते हैं। आप उपनाम का उपयोग कर सकते हैं यदि आप ओवरराइडिंग पद्धति को ओवरराइडिंग पद्धति के बाहर उपलब्ध रखना चाहते हैं जैसा कि नीचे ''सुपर_मैसेज'' के साथ दिखाया गया है।

उदाहरण:

class Thought
  def message
    puts "I feel like I am diagonally parked in a parallel universe."
  end
end

class Advice < Thought
  alias :super_message :message
  def message
    puts "Warning: Dates in calendar are closer than they appear"
    super
  end
end

टिप्पणियाँ

  1. Zhang, Jie (2015). "A novel P2P overridden API for open data communications in WWW". 2015 IEEE International Conference on Consumer Electronics-Taiwan.
  2. Flanagan 2002, p. 107
  3. 3.0 3.1 Lewis & Loftus 2006, p.454
  4. Overbey, J (2011). "Differential precondition checking: A lightweight, reusable analysis for refactoring tools". 26th IEEE/ACM International Conference on Automated Software Engineering (ASE 2011).
  5. Li, K (2014). "Residual investigation: Predictive and precise bug detection". ACM Transactions on Software Engineering and Methodology (TOSEM). 24 (2).
  6. Mössenböck, Hanspeter (2002-03-25). "Advanced C#: Overriding of Methods" (PDF). Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. pp. 6–8. Retrieved 2011-08-02.
  7. Malik 2006, p. 676
  8. Meyer 2009, page 572-575
  9. Deitel & Deitel 2001, p.474
  10. super().method in Python 3 - see https://docs.python.org/3/library/functions.html#super Archived 2018-10-26 at the Wayback Machine


यह भी देखें

संदर्भ

  • Deitel, H. M & Deitel, P. J.(2001). Java How to Program (4th ed.). Upper Saddle River, NJ: Prentice Hall.
  • Lewis, J. & Loftus, W. (2008). Java: Software Solutions (6th ed.). Boston, MA: Pearson Addison Wesley.
  • Malik, D. S.(2006). C++ Programming: Program Design Including Data Structure. (3rd ed.). Washington, DC: Course Technology.
  • Flanagan, David.(2002).Java in a Nutshell.Retrieved from http://oreilly.com/catalog/9780596002831/preview#preview
  • Meyer, Bertrand (2009). Touch of Class: Learning to Program Well with Objects and Contracts. Springer.


बाहरी संबंध