ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के अंतर्गत पॉलीमोरफ़िज्म एक बहुत ही महत्वपूर्ण अवधारणा है पॉलीमोरफ़िज्म का अर्थ है कि एक चीज का कई रूप होना। जैसे कोई मेथड अगर अलग-अलग तरह से व्यवहार करें तो इसे मेथड की पॉलीमोरफ़िज्म कहेंगे। मेथड की पॉलीमोरफ़िज्म का एक उदाहरण मेथड ओवरलोडिंग है। मेथड ओवरलोडिंग को compile time पॉलीमोरफ़िज्म कहते हैं। मेथड की पॉलीमोरफ़िज्म का एक अन्य उदाहरण मेथड ओवरराइडिंग है। मेथड ओवरराइडिंग को runtime पॉलीमोरफ़िज्म कहते हैं।
अगर किसी मेथड का नाम समान हो तो उसमें कुछ न कुछ ऐसी भिन्नता होनी चाहिए जिसके कारण उसके आचरण या व्यवहार में भिन्नता हो। मेथड के व्यवहार में भिन्नता के लिए एक कारण मेथड के पैरामीटर के प्रकार में भिन्नता होनी चाहिए। किसी मेथड का पैरामीटर वस्तुतः एक सिस्टम के इनपुट की भांति ही है। जिस तरह एक सिस्टम में इनपुट डालने पर सिस्टम निश्चित आउटपुट देता है, ठीक उसी प्रकार मेथड को शून्य या उससे अधिक इनपुट डाला जा सकता है। मेथड के इनपुट को पैरामीटर कहते हैं। जितना ही ज्यादा पैरामीटर होगा उतना ही ज्यादा मेथड के ऊपर लोड पड़ता है क्योंकि प्रत्येक पैरामीटर के प्रति मेथड को कुछ प्रोसेसिंग कार्य करना होता है। इसीलिए मेथड ओवरलोडिंग का अभिप्राय मेथड के ऊपर डाले गए पैरामीटर की प्रकृति से है जिसको मेथड प्रोसेस करता है और एक निश्चित आउटपुट देता है। मेथड ओवरलोडिंग से तात्पर्य न केवल मेथड के ऊपर डाले गए पैरामीटर की संख्या से है अपितु पैरामीटर की प्रकृति अर्थात पैरामीटर की डाटा टाइप और पैरामीटर के क्रम से भी है। किस क्रम में पैरामीटर को मेथड के भीतर डाला जा रहा है यह मेथड के आउटपुट को प्रभावित करता है। अतः मेथड के पैरामीटर के प्रकार में भिन्नता से अभिप्राय निम्न प्रकार की भिन्नता से है।
१) पैरामीटर की संख्या
२) पैरामीटर का डाटाटाइप
३) पैरामीटर का क्रम
सी शार्प प्रोग्रामिंग के अंतर्गत मेथड ओवरलोडिंग के लिए हम इन तीन प्रकार के भिन्नताओं को उदाहरण से समझेंगे। प्रोग्राम क्लास के भीतर Method नाम का मेथड बनाया गया है जिसको ओवरलोड करने के लिए अलग-अलग पैरामीटर Method मेथड को पास किया गया है। जैसे पहला Method मेथड बिना किसी पैरामीटर के है जबकि दूसरे Method मेथड के साथ int डाटाटाइप पैरामीटर है। तीसरे Method मेथड के साथ string डाटाटाइप पैरामीटर है। चौथा Method मेथड के साथ दो पैरामीटर्स हैं जिनके क्रम int और string डाटाटाइप पैरामीटर्स हैं। पांचवें Method मेथड के साथ भी दो पैरामीटर्स हैं जिनके क्रम string और int डाटाटाइप पैरामीटर्स हैं। इस प्रकार समान नाम के मेथड्स होने के बावजूद भी ये मेथड्स अलग अलग व्यवहार करते हैं। यह मेथड ओवरलोडिंग का उदाहरण है।
using System;
namespace MethodOverloads
{
class Program
{
void Method()
{
Console.WriteLine("Method 1: No parameter");
}
void Method(int i)
{
Console.WriteLine($"Method 2: One Parameter of int type {i}");
}
void Method(string s)
{
Console.WriteLine($"Method 3: One Parameter of string type: {s}");
}
void Method(int i, string s)
{
Console.WriteLine($"Method 4: Two Parameters; int type parameter followed by string type parameter: {i}, {s}");
}
void Method(string s, int i)
{
Console.WriteLine($"Method 5: Two Parameters; string type parameter followed by int type parameter: {s}, {i}");
}
static void Main(string[] args)
{
Console.WriteLine("Examples of method overloading:-");
Program p = new Program();
p.Method();
p.Method(100);
p.Method("Ajeet");
p.Method(200,"Amit");
p.Method("Amit",300);
Console.ReadLine();
}
}
}
Difference Between Method Overloading and Method Overriding
मेथड ओवरलोडिंग एक क्लास के भीतर या बाहर, अर्थात दूसरे क्लास के भीतर संभव है जबकि मेथड ओवरराइडिंग सदैव दो अलग-अलग क्लास के बीच में होता है, एक ही क्लास के भीतर किसी मेथड की ओवरराइडिंग नहीं हो सकती है।
मेथड ओवरलोडिंग के लिए मेथड के पैरामीटर में किसी न किसी प्रकार का परिवर्तन अनिवार्य है, चाहे वह पैरामीटर की संख्या हो या पैरामीटर का डाटा टाइप हो अथवा पैरामीटर के क्रम में अंतर हो, इन तीन तरीकों से किसी मेथड की मेथड ओवरलोडिंग संभव होती है परंतु मेथड ओवरराइडिंग के अंतर्गत मेथड के पैरामीटर में किसी प्रकार का परिवर्तन नहीं होता है। मेथड ओवरराइडिंग के लिए मेथड के बॉडी के भीतर परिवर्तन की जाती है। दूसरे शब्दों में मेथड किए बॉडी के भीतर प्रोसेसिंग लॉजिक में परिवर्तन करके मेथड ओवरराइडिंग की जाती है।
मेथड ओवरराइडिंग के लिए पैरेंट क्लास की परमिशन की आवश्यकता होती है इसके लिए पैरेंट क्लास के भीतर के मेथड के साथ वर्चुअल कीवर्ड की अनिवार्यता है। यदि पैरेंट क्लास के मेथड के साथ वर्चुअल मॉडिफिएर का यूज नहीं किया गया हो तो उस मेथड को चाइल्ड के भीतर ओवरराइड नहीं किया जा सकता है। इसके विपरीत चाइल्ड के भीतर मेथड ओवरलोडिंग के लिए पैरेंट क्लास की परमिशन की आवश्यकता नहीं होती है
मेथड ओवरराइडिंग हमेशा इन्हेरीटेड क्लास के भीतर की जाती है। इस तरीके से मेथड ओवरराइडिंग इनहेरिटेंस का एक हिस्सा है जबकि मेथड ओवरलोडिंग इनहेरिटेंस का हिस्सा नहीं है। मेथड ओवरलोडिंग क्लास अथवा उसके चाइल्ड क्लास के भीतर की जा सकती है।
जब पैरंट क्लास के भीतर मेथड के साथ virtual वर्चुअल कीवर्ड का प्रयोग किया जाता है तो उस मेथड का ओवरराइडिंग किया जा सकता है लेकिन यह कोई जरूरी नहीं है कि वर्चुअल मेथड का ओवरराइडिंग किया ही जाए। वर्चुअल फ्लैग तो केवल यह बताता है कि इस मेथड का ओवरराइडिंग चाइल्ड क्लास के भीतर संभव है।
अगर किसी मेथड को ओवरराइड करना हो उस मेथड के साथ वर्चुअल कीवर्ड प्रयोग अनिवार्य है। मेथड ओवरलोडिंग के लिए वर्चुअल कीवर्ड की आवश्यकता नहीं होती है
किसी मेथड के साथ override ओवरराइड कीवर्ड का प्रयोग यह बताता है कि मेथड की बॉडी में परिवर्तन किया गया है अर्थात अपने पूर्ववर्ती पैरंट क्लास के मेथड से चाइल्ड क्लास में मेथड परिवर्तित है।
निम्नलिखित उदाहरण के द्वारा मेथड ओवरराइडिंग को स्पष्ट किया गया है।
using System;
namespace Polymorphism2
{
abstract class Test
{
public abstract void Message();
}
class Parent
{
public void Display()
{
Console.WriteLine("Display Method without parameter inside same class.");
}
public void Display(string s)
{
Console.WriteLine("{0} Display Method is overloaded inside same class.", s);
}
public virtual void Show() // virtual => overridable
{
Console.WriteLine("Show method is overridable.");
}
}
class Child : Parent
{
public new void Display(string s)
{
Console.WriteLine("{0} Display Method is overloaded inside this Child class.", s);
}
public override void Show()
{
Console.WriteLine("Show method is overridden inside child class.");
}
}
class Test2 : Test
{
public override void Message() //abstract class mandatorily overridden to be consumed by inheriting class
{
Console.WriteLine("abstract class method overidden.");
}
}
}
using System;
namespace Polymorphism2
{
class Program
{
static void Main(string[] args)
{
Parent p = new Parent();
p.Display("Hello!");
p.Show();
Child c = new Child();
c.Display();
c.Display("Hi!");
c.Show();
Test2 t = new Test2();
t.Message();
Console.ReadLine();
}
}
}
© अजीत कुमार, सर्वाधिकार सुरक्षित।
इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।
No comments:
Post a Comment